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

欢迎!请查看关于页面,了解有关如何使用该网站的更多信息。

+2
ClojureScript

经过在 Slack 上的讨论,以下确实是一个bug。至少,它在 CLJS 中会以奇怪的方式抛出错误,而在 Clojure JVM 中却完美且直观。

(def tree
     (sorted-map 3
                 (sorted-map 1
                             {:a 'leaf-A})))
(def subtree
     (sorted-map 1
                 (sorted-map 100
                             {:b 'leaf-B})))
;; Fine, of course, but now...
(assoc tree
       3
       subtree)
;; Throws:   Error: Cannot compare :a to 100

Andy Fingerhut 指出了两者实现上的差异。Clojure 通过引用比较,而 CLJS 通过值比较,强制进行深层次比较。即便如此,我还觉得这个错误很神秘,并且我认为从逻辑上讲,Clojure 的做法是有道理的。

引用他说的,Clojure 实现

https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/PersistentTreeMap.java#L132

以及 CLJS 实现

https://github.com/clojure/clojurescript/blob/master/src/main/cljs/cljs/core.cljs#L8857

我们有没有忽略什么?

1 答案

+1

真正神秘的是,其他嵌套有序映射的更新都非常顺利,据我试验,即使与未排序的混合也如此。这里,它特别失败,是因为存在一个公共子路径(即。[3 1])。

...