欢迎!请参阅关于页面以获取更多有关如何使用该页面的信息。
`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) `
原因
解决方案
补丁 由
评论由:jafingerhut发表
相关的(可能是相同的)问题CLJ-207已被拒绝。
评论由:jaycfields发表
这确实看起来是重复的。我对此无法工作感到惊讶,但它确实适用于doseq。
main=> (doseq [:let [x 1] y [2 3 4]] (println x y)) 1 2 1 3 1 4 null
我认为只要存在这种不一致性,就会持续收到此类错误报告。
为了完整性,我认为值得提到的是,由于我计算的这个值的成本问题,我无法简单地更改顺序(如上面的Alex示例),我只希望它发生一次,我必须使用一个单独的 'let(正如Rich建议的)
评论由:gfredericks
Brandon Bloom指出,{{for}} 和 {{doseq}} 之间的一个区别是,{{for}} 是惰性的,因此在初始的 {{:let}} 中,不清楚它应该在第一次请求项目之前还是之后进行评估。{{doseq}} 没有这样的不确定性。
@Gary,我认为这是一个好问题,但任何选择都比现在的不一致性要好。如果你让它变得惰性,我真的想不出任何缺点。即使它不是惰性的,这也将匹配已经用 let 包装的代码的当前性能特征。