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 nil

我认为,只要存在这种不一致,您就会继续收到这个错误报告。

0

评论者:jaycfields

为了完整性,我认为值得提到的是,由于我计算值的成本,我不能简单地改变顺序(如Alex上述示例),我只希望它出现一次,我必须使用Rich推荐的单独的'let

0
by

评论者:gfredericks

Brandon Bloom 指出,{{for}} 和 {{doseq}} 之间存在一个区别,那就是 {{for}} 是懒加载的,因此在第一次请求项之后,对于初始 {{:let}} 来说,是否应该立即评估或在请求第一项之后还不明确。{{doseq}} 没有这样的歧义。

0
by

评论者:jaycfields

@Gary,我认为这是一个很好的问题,但无论如何选择都会比当前的矛盾情况好。如果你将其改为懒加载,我真的想不出有什么缺点。即使它不是懒加载的,这也将符合当前将 for 包裹在 let 中的代码的性能特征。

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