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