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 投票

评论由:raspasov 提供

在我使用最新版本的core.async和ClojureScript 0.2.395时也遇到了同样的问题。

我会将其升级为不是次要问题,因为它严重破坏了 (and ...) 做出的承诺。

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

这会抛出如下异常

未为类型 cljs.core/Keyword: :loading 定义 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 报告)
...