欢迎!请参阅 关于 页面以了解更多关于它如何工作的信息。
`user> (for [y [2 3 4]
`
:let [x 1]] [x y])
([1 2] [1 3] [1 4])user> (for [:let [x 1]
y [2 3 4]] [x y])
IllegalStateException 无法弹出空向量 clojure.lang.PersistentVector.pop (PersistentVector.java:380) `
原因
解决方案
补丁 经审查
评论者:jafingerhut
相关的(可能是相同的)票号 CLJ-207 已被拒绝。
评论者:jaycfields
看起来这是一个重复的问题。我对此表示惊讶,但它对 doseq 作用正常。
main=> (doseq [:let [x 1] y [2 3 4]] (println x y)) 1 2 1 3 1 4 nil
我认为只要存在这种不一致性,您就会不断地收到这个错误报告。
为了完整性,我想提及,由于我正在计算的价值的成本,我无法简单地更改顺序(就像上面的 Alex 示例一样)。我只希望它只发生一次,我必须使用单独的 'let(如 Rich 所建议)
评论人:gfredericks
Brandon Bloom 指出,{{for}} 和 {{doseq}} 之间的一个区别是 {{for}} 是惰性的,因此对初始的 {{:let}} 而言,不清楚它应该在请求第一个项目之前还是之后立即进行评估。{{doseq}} 没有这样的歧义。
@Gary,我认为这是一个很好的问题,但任何一种选择都比现在的不一致性要好。如果你让它变成惰性的,我简直想不出任何坏处。即使它不是惰性的,这也会与当前代码包裹在 let 中的性能特性相匹配。