欢迎!请查看关于页面,了解更多如何使用本站的信息。
`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
相关的(可能是相同的)ticket 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中的代码的性能特性。