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