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

欢迎!有关如何使用本站的更多信息,请参阅“关于”页面。

0
ClojureScript

启用高级编译后,具有键“v”的JS对象会导致js->clj的(code)(seq? x)子句返回true,但是由于js/Object不满足ISeqable,所以下一行的map导致了错误。我已经在circleci前端代码库中确定了这个问题。目前正在创建一个最小测试项目。

5 个回答

0

评论者:iandavis

无法生成最小案例。该问题确实在我们的存储库中存在,但无法在更简单的案例中造成故障。如果有其他人遇到此问题,请将其公开,但如果还有其他报告,则不期望进行后续跟进。

0
_评论者:thheller_

{{(seq? x)}}执行协议检查,检查给定的对象是否具有协议的标记属性。在这种情况下,该属性很可能被重命名为{{x.v}},从而导致冲突。

很久以前就为普通协议修复了这个问题:[CLJS-1658](https://dev.clojure.org/jira/browse/CLJS-1658)

但快速路径协议(即ISeq)使用位检查{{(x.cljs$lang$protocol_mask$partition0$ & (64))}},我假设你在{{v}}中的值满足这个检查?
0

评论人:dnolen

我认为托马斯的分析在这里是正确的。我认为在 js->clj 中的 seq?coll? 检查可能是考虑不周的,但改变这一点可能会给另一群用户引入不同类型的损坏。您可以为您的 JS 对象及其属性提供一个 externs 文件(如果您知道它是动态的,这将很困难)或者写一个更简单的自定义 js->clj,它只期望 JS 值(无协议检查)并将其用作替代。

0

评论者:iandavis

好吧,我觉得可能就是这样。我考虑过移除前三个案例,或者只是颠倒 js 和协议检查的顺序,但我并不完全确定这可能会引入什么类型的破坏。如果我们只是在使用我们的 json 解析器中的修改版,它应该没问题,对吧?似乎那些协议检查只有在 Clojure 与 json 混合使用时才有用。

0
参考:[https://clojure.atlassian.net/browse/CLJS-2050](https://clojure.atlassian.net/browse/CLJS-2050)(由 alex+import 报告)
...