2024 Clojure 状态调查!中分享你的想法。

欢迎!请查看关于页面,了解更多这个网站的工作原理。

0
ClojureScript

我们需要对第一个段进行递归,传递一个新的额外参数给 resolve-var,指示我们不应该尝试在当前命名空间中解析,而是发出警告。

5 答案

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

评论者:thheller

事实上,我为shadow-cljs添加了一个相当奇怪的解决方案来解决这个问题(链接:1),它已经发现了一些流行的CLJS库中的一些实际错误,以及{{cljs.core}}本身的一些问题。这绝对不是完整的总结,但这些应该在此工作之前得到修复,否则会产生很多警告。尽管如此,仍然不确定如何干净地解决这个问题。

https://dev.clojure.org/jira/browse/CLJS-2982
https://dev.clojure.org/jira/browse/CLJS-2983
https://dev.clojure.org/jira/browse/CLJS-2984

https://github.com/Day8/re-frame-10x/issues/219
https://github.com/nathanmarz/specter/issues/267

(链接:1) https://github.com/thheller/shadow-cljs/blob/22944d9bba14a8428efbd52463a37eb636017609/src/main/shadow/build/cljs_hacks.cljc#L239-L308

0
by

评论者:thheller

在rrb-vector库中还发现了另一个问题。(链接:1)

符号
`clojure.core.rrb_vector.rrbt.Vector`
在技术上产生了正确的JS结果,但没有与之关联的分析器数据。当然,在这个地方不要求这个,但这感觉应该会产生一个警告。

(链接:1) https://github.com/clojure/core.rrb-vector/blob/88c605a72f1176813ca71d664275d480285f634e/src/main/cljs/clojure/core/rrb_vector/macros.clj#L23-L24

0
by

评论者:mfikes

事实上,托马斯指出的这个问题确实破坏了自托管的ClojureScript,所以如果我们改善了这方面的警告,那就好了。见CRRBV-16

0
by
参考:https://clojure.atlassian.net/browse/CLJS-712(由dnolen报告)
...