2024 Clojure状态调查!中分享您的想法。

欢迎!请参阅关于页面以了解有关此功能的更多信息。

+2
ClojureScript

在与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

我们是否忽略了什么?

1 答案

+1

真正难以理解的是,其他对嵌套有序映射的更新似乎都很正常,至少据我所知实验是这样,即使是与无序映射混合使用也是如此。这里,它特别失败是因为存在一个公共子路径(例如 [3 1])。

...