我正在实现一个自定义数据结构,出于所有意图和目的,它是一个排序的地图。我想对其进行编程,以便在涉及映射时可以使用 clojure 的所有抽象,例如assoc
、count
等。为了做到这一点,我需要将 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
?