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

原因

解决方案

Patch
筛选通过

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示例一样)。我只希望它只发生一次,并且我必须使用Rich推荐的分离'let。

0

评论由:gfredericks

Brandon Bloom指出,for和doseq之间的一个不同之处在于,for是惰性的,因此在初始 let 未指定时,尚不清楚它是在请求第一个元素后立即评估还是之后。{{doseq}}没有这种含糊不清。

0

评论者:jaycfields

@Gary,我认为这是一个好问题,但任何一种选择都优于当前的不一致性。如果您将其使之成为惰性的,我真的想不出任何缺点。即使它不是惰性的,这也会与当前将 for 包裹在 let 中的代码的性能特性相匹配。

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