2024 年 Clojure 状态调查! 中分享您的观点。

欢迎!请访问 关于 页面以了解有关如何使用本网站的更多信息。

+1 投票
core.async

我在 go 块中有以下 ClojureScript 代码片段

(cond
(and (vector? x) (= (first x) :some-key)) ...)

这会在 cond 情况下生成以下 JavaScript 代码

if (40 === f) {
return
d = b(link: 9),
f = cljs.core.vector.call(null, d),
d = cljs.core.first.call(null, d),
d = cljs.core._EQ_.call(null, d, new cljs.core.Keyword(null, "some-key", "some-key", -978969032)),
cljs.core.truth_(f && d) ? b(link: 1) = 42 : b(link: 1) = 43,
new cljs.core.Keyword(null, "recur", "recur", -437573268);
}

在我看来,这两个 and 参数实际上都会被执行。因此,当遇到这个 cond 情况且 'x' 不是可迭代对象时,我的代码会崩溃。

4 个答案

0 投票

评论者:favila

CLJS-864 可能是相同的问题。(它还有一个用于复现的小型测试项目。)

0 投票

评论者: raspasov

这种情况也曾发生在 ClojureScript 的最新版本 core.async 0.2.395 中。

我将此问题升级为重要,因为它严重破坏了 (and ...) 所承诺的功能。

(def cards :loading)
(go (and (vector? cards) (< 0 (count cards))))

这会抛出如下异常

No protocol method ICounted.-count defined for type cljs.core/Keyword: :loading

我能通过嵌套检查解决这个问题,如下所示
(go (if (vector? cards)

  (if (< 0 (count cards))
    (println "counting cards..."))))
0 投票

评论者:mfikes

如果你

(宏展开 '(go (and (vector? cards) (< 0 (count cards)))))

你会看到对 * 特殊形式参数的提升和 {{let}} 绑定,导致执行该特殊形式本来不会执行的代码。

0 投票
参考: https://clojure.atlassian.net/browse/ASYNC-91(由 alex+import 报告)
...