你好!
这个小代码片段演示了问题
(doseq [outer-seq (list (range)) inner-seq outer-seq])
就是这样。它不仅消耗了我的处理器,还消耗了所有可用内存。实际上,它可能影响(并且确实这样做)复杂惰性结构(如大型 XML 文档)的消耗。
我认为这是一个至少非平凡的行为了。
可以通过这个小补丁来修复它。我们可以在当前迭代之前获取下一个元素,而不是之后,这样外部循环就不会保留对内部序列头部的引用。
这个补丁并没有解决所有问题,例如,以下代码会泄漏:
(doseq [outer-seq [(range)] inner-seq outer-seq])
泄漏的原因在于分块序列(在此为向量)会根据设计保留当前元素。