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 中的那样),有时会展开成 `(js* "(~{}) || (~{})" a b)`。ioc 机构没有对 `js*` 做特殊处理,所以它采用常规的 ANF(抽象语法树)转换


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


变为


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

因此当然会丢失短路特性。


在 ioc 机构中为 js* 提供一般支持需要解析和重写 JavaScript,这似乎不太可能发生。可以处理 js* 的具体情况,通过匹配确切的 JavaScript 字符串,但这可能有点脆弱。

最好的办法可能是将 clojurescript 的 or 定义改为总是发出 if(像 clojure 中的那样),并将优化移动到编译器中。
0

评论者:hiredman

此外,clojurescript 中的 and 和 or 都会在宏展开过程中进行分析,这可能导致宏被多次展开

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