*评论者: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一样),并将优化移动到编译器中。