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

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

0
ClojureScript

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

5 个答案

0

评论者:iandavis

无法生成最小案例。这个问题肯定在我们的代码库中失败,但是无法使其在更简单的情况下失败。将其问题保留在开放状态,以便其他人遇到时可以使用,但不期待有进一步的跟进,除非有其他报告。

0
评论者:thheller

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

这已经为常规协议修复了一段时间: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(由alex+import举报)
...