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 报告)
...