评论人:cgrand
本提案建议捕捉递归 seq 实现时(即在计算 lazy-seq 的主体时尝试访问同一 seq),并抛出异常。
目前在这种情况下,对seq的递归访问返回nil。这导致代码看似在正常工作,但实际上产生错误的结果,甚至有可能产生错误代码却由于运气产生了正确的结果(参阅https://groups.google.com/d/topic/clojure/yD941fIxhyE/discussion以获取此类示例)。
因此,此补丁在所有潜在的递归方法调用之前(.seq的while中的.sval和.sval中的.invoke)对LazySeq状态(f、sv和s字段)的更改进行移动,以便在重新进入时,LazySeq的状态保持一致,并且能够传达seq已经开始计算的事实。
目前,递归调用可能会发现f和sv被清除,并得出结论计算已完成,结果在s中,尽管s尚未受到影响。
目前
状态 f sv s
| :-- | :-- | :-- | :-- | :-- |
未实现 非空 null null
实现中 null null 任何东西
正在实现中的/from fn.invoke 不为空 null null
正在实现中的/from ls.sval null null null
注意,“正在实现中”状态与“未实现”或“实现中”重叠。
(注:“任何东西”包括null)
使用补丁
状态 f sv s
| :-- | :-- | :-- | :-- | :-- |
未实现 非空 null null
实现中 null null 除了这个之外任何东西
正在实现中 null 这个