欢迎!请查看关于页面,了解有关如何使用该网站的更多信息。
经过在 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
我们有没有忽略什么?
真正神秘的是,其他嵌套有序映射的更新都非常顺利,据我试验,即使与未排序的混合也如此。这里,它特别失败,是因为存在一个公共子路径(即。[3 1])。