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中添加了一个比较hackish的解决方案(链接: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)
...