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 null

我认为只要存在这种不一致性,就会持续收到此类错误报告。

0

评论由:jaycfields发表

为了完整性,我认为值得提到的是,由于我计算的这个值的成本问题,我无法简单地更改顺序(如上面的Alex示例),我只希望它发生一次,我必须使用一个单独的 'let(正如Rich建议的)

0

评论由:gfredericks

Brandon Bloom指出,{{for}} 和 {{doseq}} 之间的一个区别是,{{for}} 是惰性的,因此在初始的 {{:let}} 中,不清楚它应该在第一次请求项目之前还是之后进行评估。{{doseq}} 没有这样的不确定性。

0

评论由:jaycfields发表

@Gary,我认为这是一个好问题,但任何选择都比现在的不一致性要好。如果你让它变得惰性,我真的想不出任何缺点。即使它不是惰性的,这也将匹配已经用 let 包装的代码的当前性能特征。

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