O'Reilly の Clojure プログラミングの本を読んでいます。
頭の保持の例に出くわしました。最初の例はd
(私が推測する) への参照を保持しているため、ガベージ コレクションは行われません。
(let [[t d] (split-with #(< % 12) (range 1e8))]
[(count d) (count t)])
;= #<OutOfMemoryError java.lang.OutOfMemoryError: Java heap space>
2 番目の例では保持されないため、問題ありません。
(let [[t d] (split-with #(< % 12) (range 1e8))]
[(count t) (count d)])
;= [12 99999988]
ここで得られないのは、どの場合に何が正確に保持されるのか、そしてその理由です。を返そうとすると[(count d)]
、次のようになります。
(let [[t d] (split-with #(< % 12) (range 1e8))]
[(count d)])
同じメモリの問題を引き起こしているようです。
count
さらに、すべての場合にシーケンスを実現/評価することを読んだことを思い出します。だから、私はそれを明確にする必要があります。
最初に返そうとすると(count t)
、まったく返さない場合よりも高速/メモリ効率が高くなりますか? そして、どのような場合に何となぜ保持されるのでしょうか?