_评论者:thheller_
我试图弄清楚为什么 {{process.env.FOO}}(没有{{js/}})不会产生警告时,偶然发现了这个问题。几乎所有带有点号的符号都会意外地解析并正常工作。它们也不会产生任何警告。
在尝试修复这个问题时,我遇到了很多依赖这种行为的代码。最突出的是{{defrecord}}和{{exists?}}。
{{defrecord}}可以通过使用{{cljs.core.MapEntry}}[1]而不是{{cljs.core/MapEntry}}来轻松修复。{{cljs.core.MapEntry}}解析为{{cljs/core.MapEntry}},几乎所有的带有点号的符号都会解析为第一个段变成命名空间。这之所以有效,是因为{{munge}}后来将{{/}}转换成{{.}}。
{{exists?}}会将{{some.nested.Thing}}拆分为检查{{some}}、{{some.nested}}、{{some.nested.Thing}},这又变成了{{some}}、{{some/nested}}、{{some/nested.Thing}}。我尝试在{{cljs.analyzer/analyze-symbol}}中直接修复此问题,正确地将{{some.nested.Thing}}反编译为{{(. (. some -nested) -Thing)}},但这还不够,因为宏可以直接使用带有点号的符号调用{{cljs.analyzer/resolve-var}}(例如{{exists?}})。
到目前为止,我还不确定如何修复这个问题。我认为这确实值得修复,但这可能会在用户代码中产生大量的警告。这是可以接受的吗?
[1]
https://github.com/clojure/clojurescript/blob/6062744a1600479d5b9c641db9fb15cbb