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

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

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

评论者:mfikes

诸位,托马斯指出的这个问题确实会使自托管的ClojureScript变得复杂,如果我们改善了这方面的警告,那就更好了。见CRRBV-16

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