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