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

欢迎!请查看关于页面,了解更多此网站的工作方式。

0
core.async

`
(go (or true

    (= (<! (do (js/console.log "this should not happen") (chan)))
       :doesnt-matter)))

`

5 答案

0

评论者:alexmiller

这个=!缺少一个通道,所以这似乎是开始时就有问题的代码 - 标记为无法复现,直到示例修复。

0

评论者:lgs32a

嗨,Alex,<!的无效参数是有意的。

重点是,根据or的既定行为,它永远不会被评估,因此这是正确的。

您也可以用以下代码替换第2行:
(= (<! (do (js/console.log "this should not happen") (chan)))
或者在那里调用一个打印并返回通道的函数。

在我看来,这不会影响将其视为错误的标志。

该错误仍存在于0.2.395中。

0
*评论者:hiredman*

出于某种奇怪的原因(可能是某种优化?),cljs中的or宏有时被展开为if的调用(就像clojure的does一样),有时展开为`(js* "(~{}) || (~{})" a b)`。ioc机构没有对js*作特殊处理,所以它像正常的ANF一样进行转换


(js* "(~{}) || (~{})" A B)


变为


(let [x A
      y B]
  (js* "(~{}) || (~{})" x y))

所以当然,你会失去短路。


在ioc机器中为js*提供通用支持需要解析和修改javascript,这似乎不太可能发生。js*的具体案例可以通过匹配javascript的精确字符串来处理,但这可能有点脆弱。

最好的办法可能是更改clojurescript中or的定义,使其始终发出ifs(像clojure一样),并将优化移动到编译器中。
0
by

评论者:hiredman

在clojurescript中,`or`和`and`都运行分析作为宏扩展的一部分,这可能导致宏被多次扩展。

0
by
参考: https://clojure.atlassian.net/browse/ASYNC-128(由lgs32a报告)
...