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