一个已实现序列是内存中对象的链,链中的每个链接都指向一个值和下一个链接,直到最终指向一个函数对象,该对象是序列剩余未实现的部分。对序列中任意链接的引用都会导致从该点开始的链的其余部分被强引用并无法被GC。
如果您只指向链的未实现“末端”,则您身后的所有链接都可以被回收。当您“持有头部”时,该指针指向链的起点,这会阻止从开始到未实现点的N个链接被保留在内存中。
例如
(def r (repeat 100000000 "abcdef")) ;; r holds a strong reference to the head
(count r)
vs
(count (repeat 100000000 "abcdef"))
这可以遍历序列,允许回收计数器后面的链接。(注意,这里的range
是人们在这些示例中常用的典型东西,但它在常见情况下有一个优化的count
。)