评论者: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的),并将优化移至编译器中。