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