レイジーシーケンスを構築するときにflattenを使用しているときに観察される動作がわかりません。
clojure.coreのソースを見ると、flatten関数がfilterを呼び出しているため、遅延シーケンスを返す必要があることがわかります。それでも、次のスニペットはスタックオーバーフローエラーを表示します。スニペットでは、flattenの呼び出しがconcatの呼び出しに置き換えられた場合、問題なく機能します
(defn l-f [c]
(if (nil? c) []
(lazy-seq (flatten (cons [[ :h :j] :a :B] (l-f (rest c)))))))
(take 10 (l-f (repeat 2))) is how I invoke it.
これはかなり不自然な例です。また、flattenとconcatを使用すると、ネストレベルが異なるシーケンスが得られることも認識しています。
clojure.coreのコードについての私の(限られた)理解がそうではないと示唆しているにもかかわらず、なぜflattenが怠惰を壊しているように見えるのかを理解しようとしています。