_评论人: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,这似乎不太可能发生。可以通过匹配确切的JavaScript字符串来处理js*的具体情况,但这可能有点脆弱。
最好的做法可能是将clojurescript中对or的定义改为始终输出ifs(就像clojure的),并将优化移到编译器中。