欢迎!请参阅关于页面以了解有关如何工作的更多信息。
`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 nil
我认为只要这种不协调存在,你还会继续收到这个错误报告。
为了完整性,我认为提一下,由于我要计算的值的成本,我不能简单地改变顺序(就像上面Alex的示例),我只希望它发生一次,并且我必须使用一个单独的'let(如Rich所推荐的)
评论者:gfredericks
Brandon Bloom指出,{{for}}和{{doseq}}之间有一个区别,那就是{{for}}是惰性的,所以在初始的{{:let}}中,不清楚它是应该立即计算还是应在请求第一个项目后计算。{{doseq}}没有这种歧义。
@Gary,我认为这是一个很好的问题,但无论哪种选择都比当前的矛盾要好。如果你将其改为惰性的,我实在想不出任何缺点。即使是非惰性的,这也将符合for包裹在let中的现有代码的性能特征。