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 无法弹出空向量 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,我认为这是一个很好的问题,但任何一种选择都比现在的不一致性要好。如果你让它变成惰性的,我简直想不出任何坏处。即使它不是惰性的,这也会与当前代码包裹在 let 中的性能特性相匹配。

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