_评论由:thheller_发表
我在试图弄清楚为什么{{process.env.FOO}}(没有{{js/}})不会产生警告时偶然发现,几乎所有带点的符号都会错误地解析,并且似乎可以正常工作。它们也不会产生任何警告。
在试图修复这个问题时,我遇到了很多代码都是在依赖这种行为。最显著的是{{defrecord}}和{{exists?}}。
{{defrecord}}很容易修复,因为它使用{{cljs.core.MapEntry}} [1]而不是{{cljs.core/MapEntry}}。{{cljs.core.MapEntry}}解析为{{cljs/core.MapEntry}},几乎所有的带点符号都会解析为第一个部分,将其转换为命名空间。这有效,因为{{munge}}会在 later on 将{{/}}转换为{{.}}。
{{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