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