请分享您的想法,参加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

相关的(可能是相同的)ticket 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报告)
...