_评论由: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 中的那样),并将优化移动到编译器中。