_Comment made by: thheller_
当我试图搞清楚为什么 {{process.env.FOO}}(没有 {{js/}})没有产生警告时,偶然发现了几乎所有带有点号的符号都会意外地解析并sort of work,并且从未产生过任何警告。
在尝试修复这个问题时,我遇到了大量似乎依赖于这种行为的代码。最突出的是 {{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