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.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' 参数实际上都会被执行。结果是我的代码在遇到这个 cond 情况且 'x' 不可迭代时崩溃。

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

评论者:mfikes

如果你

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

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

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