欢迎!请查看关于页面,了解更多此如何工作的信息。
在启用高级编译的情况下,具有键 "v" 的 JS 对象会使 (seq? x) 子句的 js->clj 返回 true,但由于 js/Object 不满足 ISeqable,下一行的 map 引发了错误。我在 circleci 前端代码库中发现了这个问题。目前正在创建一个最小化项目测试用例。
(seq? x)
js->clj
ISeqable
map
评论由:iandavis 发布
无法生成最小化案例。它肯定在我们仓库中失败,但无法使它在一个更简单的案例中失败。保留此问题以供其他人参考,但如果没有人报告,则不期望有任何后续跟进。
评论由:dnolen 发布
我认为托马斯的分析在这里是正确的。我认为在 js->clj 中使用 seq? 和 coll? 检查可能考虑不周,但改变这可能会为不同的用户群引入不同类型的故障。您可以提供包含您的 JS 对象及其属性的 externs 文件(如果动态,则难度较大),或者编写一个更简单的自定义 js->clj,它仅期望 JS 值(无需协议检查),并使用它代替。
seq?
coll?
好吧,我觉得可能就是这样。我曾考虑过删除前三种情况,或者只是交换 js 和协议检查的顺序,但我没有完全确定这可能会引入什么类型的故障。如果我们仅仅在我们的 json 解析器中使用修改后的版本,应该没问题,对吧?似乎那些协议检查只在你有 clojure 与 json 混合时才有用。