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

欢迎!有关此如何运作的更多信息,请参阅 关于 页面。

0
ClojureScript

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

5 个答案

0

评论者:iandavis

无法生成最小案例。在我们的仓库中确实失败了,但无法使其在任何更简单的案例中失败。留下此问题,以防他人遇到,但如果没有其他报告,不要期待任何后续行动。

0
评论者:thheller

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

这已在一段时间前修复了普通协议:[link](https://dev.clojure.org/jira/browse/CLJS-1658)

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

评论者:dnolen

我认为托马斯的分析在这里是正确的。我认为在js->clj中使用seq?和coll?检查可能是考虑欠周的,但改变这一点可能会为不同的用户群体引入不同类型的破坏。您可以提供您的JS对象和它们的属性的外部文件(如果动态则难以执行)或编写一个更简单的自定义js->clj,它仅期望JS值(无协议检查)并使用它。

0

评论者:iandavis

好的,我想是这样的。我考虑过删除前三种情况或只是翻转js和协议检查的顺序,但我不完全确定这可能会引入什么样的破坏。如果我们只在我们自己的json解析器中使用修改后的版本,应该没问题,对吧?那些协议检查似乎只有在Clojure与JSON混合时才有用。

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