欢迎!有关本站的工作方式,请参阅关于页面上的更多信息。
`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 Can't pop empty vector clojure.lang.PersistentVector.pop (PersistentVector.java:380) `
原因
解决方案
Patch 筛选通过
评论者: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示例一样)。我只希望它只发生一次,并且我必须使用Rich推荐的分离'let。
评论由:gfredericks
Brandon Bloom指出,for和doseq之间的一个不同之处在于,for是惰性的,因此在初始 let 未指定时,尚不清楚它是在请求第一个元素后立即评估还是之后。{{doseq}}没有这种含糊不清。
@Gary,我认为这是一个好问题,但任何一种选择都优于当前的不一致性。如果您将其使之成为惰性的,我真的想不出任何缺点。即使它不是惰性的,这也会与当前将 for 包裹在 let 中的代码的性能特性相匹配。