相关疑难解决方法(0)

Clojure头部保留

我正在读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)首先尝试返回,那么如果我根本不返回它会如何更快/更高效?在哪种情况下保留了什么?为什么?

lisp jvm functional-programming clojure

27
推荐指数
2
解决办法
1803
查看次数

标签 统计

clojure ×1

functional-programming ×1

jvm ×1

lisp ×1