评论者:cgrand
这里的提议是捕获递归序列实现(即在计算惰性序列体时尝试访问相同的序列)并抛出异常。
目前,当发生这种情况时,对序列的递归访问返回 nil。这导致代码看似可以工作但产生错误结果,或者甚至可能是错误的代码意外产生正确的结果(请参见https://groups.google.com/d/topic/clojure/yD941fIxhyE/discussion中的示例)。
因此,这个补丁将对LazySeq状态(f、sv和s字段)的修改移动到所有潜在的递归方法调用(.seq中的.sval和.sval中的.invoke)之前,以确保在重新进入时,LazySeq的状态是一致的,并能传达seq已经在被计算的事实。
目前,递归调用可能在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|这个|