在Practical Clojure中,作者提到一旦计算了一个懒惰的seq值,它就会被缓存。
如果我们从lazy-seq获得非常大量值,我们是否会看到内存不足错误?或者是否有一种机制来防止这种情况(例如,删除旧的缓存值以便为新的缓存值腾出空间)?
答案 0 :(得分:3)
懒惰序列中的已实现元素可以像Clojure中的任何其他对象一样被垃圾收集,但有一个重要的警告。你不应该持有对序列头部的引用。这被称为“抱头”。
具体而言,使用doall
来评估整个序列,或者在使用def
遍历延迟序列时将参考(例如在原子或map
中)存储到惰性序列中抱头。