2024 Clojure 状态调查! 中分享您的想法。

欢迎!请参阅 关于 页面了解此网站的更多信息。

+1
core.async

以下是在 go 块中 ClojureScript 代码的片段

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

这会生成以下 JavaScript 代码(用于 cond 情景)

if (40 === f) {
return
d = b(link: 9),
f = cljs.core.vectorQMARK.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 参数实际上都会被评估。因此,当 'x' 不是可迭代的,我的代码触碰到这个 cond 情景时会崩溃。

4 个答案

0

评论者:favila

CLJS-864 可能是相同的问题。(它还包括一个用于复制的简单测试项目。)

0

评论者:rashpasov

我也在与 Core.Async 的最新版本(在 ClojureScript 0.2.395 上)发生这种情况。

我会把这个问题升级为重大问题,因为它严重违反了 (and ...) 的承诺。

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

这会抛出如下异常

未定义类型 cljs.core/Keyword 的协议方法 ICounted.-count

我能够通过这样嵌套检查来解决这个问题
(go (if (vector? cards)

  (if (< 0 (count cards))
    (println "counting cards..."))))
0
by

评论由:mfikes 发布

如果你

(macroexpand '(go (and (vector? cards) (< 0 (count cards)))))

你将看到,特殊形式 * 的参数被提升并绑定到 {{let}},这会导致执行特殊形式本不会执行代码。

0
by
参考资料: https://clojure.atlassian.net/browse/ASYNC-91 (由 alex+import 提出)
...