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