2024 State of Clojure Survey!中分享您的想法!

欢迎!请查看关于页面,了解更多关于此页面如何工作的信息。

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)使用bit检查{{(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(由ale getters报错)
...