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