2

我正在实现一个自定义数据结构,出于所有意图和目的,它是一个排序的地图。我想对其进行编程,以便在涉及映射时可以使用 clojure 的所有抽象,例如assoccount等。为了做到这一点,我需要将 clojure 的clojure.lang.IPersistentMap协议扩展到我的新排序映射类型。

我的问题是:它的作用是什么assocEx,或者它的目的是什么?在普通的 clojure 映射上调用它表明它不同于assoc如果您尝试在映射中已存在键的位置插入键/值对,则会引发异常:

user> (.assocEx (cast clojure.lang.IPersistentMap {:a :b}) :a 1)
RuntimeException Key already present  clojure.lang.Util.runtimeException (Util.java:219)

这与 不同assoc,后者只是将地图中的旧值替换为新值:

user> (.assoc (cast clojure.lang.IPersistentMap {:a :b}) :a 1)
{:a 1}

但是我似乎找不到显示此功能的“clojure”功能(上面未使用互操作表单/强制转换的功能)。使用普通的 clojure 抽象函数,我们在哪里可以看到这个函数的效果assoc

4

1 回答 1

4

什么都不再使用assocEx了。它是更早时期的遗迹。如果您正在编写自己的地图类型,则可以实现(assocEx [m k v] (throw (Exception.))).

于 2014-08-14T22:19:07.967 回答