欢迎!请参阅关于页面以了解有关此功能的更多信息。
在与Slack上的讨论后,以下确实像是一个错误。至少,在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])。