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

欢迎!请参阅 关于 页面以了解更多有关如何使用此功能的信息。

0
ClojureScript

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

5 个答案

0
_Comment made by: thheller_

当我试图搞清楚为什么 {{process.env.FOO}}(没有 {{js/}})没有产生警告时,偶然发现了几乎所有带有点号的符号都会意外地解析并sort of work,并且从未产生过任何警告。

在尝试修复这个问题时,我遇到了大量似乎依赖于这种行为的代码。最突出的是 {{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

Comment made by: thheller

仅供参考,我为 shadow-cljs 添加了一个非常 hackish 的 workaround 来解决这个问题(链接: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

Comment made 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

评论者:mfikes

仅供参考,托马斯指出的这个问题确实会使自托管的 ClojureScript 失效,所以我们改善这一部分的警告将是好的。见 CRRBV-16

0
...