由:cgrand发表的评论
此处建议捕获递归序列实现(即当计算一个惰性序列的身体尝试访问相同的序列)并抛出异常。
当前,当这种情况发生时,对序列的递归访问返回nil。这导致代码看似工作但产生不正确的结果,或者甚至偶尔产生正确结果的错误代码(参见https://groups.google.com/d/topic/clojure/yD941fIxhyE/discussion中的此类示例)。
因此,这个补丁在所有潜在递归方法调用( seq 的循环中的 .sval 和 .sval 中的 .invoke)之前移动了LazySeq状态的修改(f, sv 和 s 字段),以便在重新进入时,LazySeq的状态是一致的,能够传达序列正在被计算的事实。
目前,递归调用可能会发现f和sv被清空,并得出计算已完成且结果在s中的结论,尽管s尚未受到影响。
目前
|状态|f|sv|s|
| :-- | :-- | :-- | :-- | :-- |
|未实现|非空|null|null|
|已实现|null|null|任何东西|
|正在实现/从fn.invoke的递归调用|非空|null|null|
|正在实现/从ls.sval的递归调用|null|null|null|
注意,“正在实现”状态与“未实现”或“已实现”状态重叠。
(注:“任何东西”包括null)
用这个补丁
|状态|f|sv|s|
| :-- | :-- | :-- | :-- | :-- |
|未实现|非空|null|null|
|已实现|null|null|除了这个以外任何东西|
|正在实现|null|null|这个|