我正在读O'Reilly的Clojure Programming book.
我找到了头部保留的例子.第一个例子保留对d(我推测)的引用,因此它不会收集垃圾:
(let [[t d] (split-with #(< % 12) (range 1e8))]
[(count d) (count t)])
;= #<OutOfMemoryError java.lang.OutOfMemoryError: Java heap space>
Run Code Online (Sandbox Code Playgroud)
虽然第二个例子不保留它,但它没有问题:
(let [[t d] (split-with #(< % 12) (range 1e8))]
[(count t) (count d)])
;= [12 99999988]
Run Code Online (Sandbox Code Playgroud)
我没有得到的是在哪种情况下保留了什么以及为什么.如果我试着回来[(count d)],就像这样:
(let [[t d] (split-with #(< % 12) (range 1e8))]
[(count d)])
Run Code Online (Sandbox Code Playgroud)
它似乎创造了相同的内存问题.
此外,我记得count在每种情况下都会实现/评估一个序列.所以,我需要澄清一下.
如果我(count t)首先尝试返回,那么如果我根本不返回它会如何更快/更高效?在哪种情况下保留了什么?为什么?