_评论者:hiredman_
由于某种奇怪的原因(可能是某种优化的原因?),在某些情况下,cljs 中的 or 宏扩展为 if 调用(像 clojure 中的 does 一样),有时扩展到 `(js* "(~{}) || (~{})" a b)`。ioc 机器没有特别处理`js*`,所以它执行其正常的 ANF 转换
(js* "(~{}) || (~{})" A B)
转换为
(let [x A
y B]
js* "(~{}) || (~{})" x y)
因此当然失去了短路。
对js*在ioc机器中的通用支持将需要解析和重写JavaScript,这似乎不太可能发生。js*的具体情况可以通过匹配JavaScript的确切字符串来处理,但这可能会比较脆弱。
最好的方法是改变ClojureScript中或的定义,使其总是发出If(像Clojure),并将优化移入编译器。