_评论由: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