2024 Clojure状态调查中分享你的想法!

欢迎!请参阅关于页面以了解有关如何工作的更多信息。

0
Clojure

`
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)
`

原因

解决方案

补丁
筛查

6 答案

0

评论者:jafingerhut

相关的(可能是相同的)条目CLJ-207已被拒绝。

0

评论者:jaycfields

看起来这是一个重复的情况。我对此不工作感到惊讶,但它对doseq有效

main=> (doseq [:let [x 1] y [2 3 4]] (println x y)) 1 2 1 3 1 4 nil

我认为只要这种不协调存在,你还会继续收到这个错误报告。

0

评论者:jaycfields

为了完整性,我认为提一下,由于我要计算的值的成本,我不能简单地改变顺序(就像上面Alex的示例),我只希望它发生一次,并且我必须使用一个单独的'let(如Rich所推荐的)

0

评论者:gfredericks

Brandon Bloom指出,{{for}}和{{doseq}}之间有一个区别,那就是{{for}}是惰性的,所以在初始的{{:let}}中,不清楚它是应该立即计算还是应在请求第一个项目后计算。{{doseq}}没有这种歧义。

0

评论者:jaycfields

@Gary,我认为这是一个很好的问题,但无论哪种选择都比当前的矛盾要好。如果你将其改为惰性的,我实在想不出任何缺点。即使是非惰性的,这也将符合for包裹在let中的现有代码的性能特征。

0
参考:https://clojure.atlassian.net/browse/CLJ-1316(由jaycfields报告)
...