Clojure的lazy-seq缓存

时间:2016-02-18 04:56:46

标签: caching clojure lazy-sequences

Practical Clojure中,作者提到一旦计算了一个懒惰的seq值,它就会被缓存。

如果我们从lazy-seq获得非常大量值,我们是否会看到内存不足错误?或者是否有一种机制来防止这种情况(例如,删除旧的缓存值以便为新的缓存值腾出空间)?

1 个答案:

答案 0 :(得分:3)

懒惰序列中的已实现元素可以像Clojure中的任何其他对象一样被垃圾收集,但有一个重要的警告。你不应该持有对序列头部的引用。这被称为“抱头”。

具体而言,使用doall来评估整个序列,或者在使用def遍历延迟序列时将参考(例如在原子或map中)存储到惰性序列中抱头。