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 报告)
...