I am implementing a custom data structure, that, for all intents and purposes, is a sorted map. I wanted to program it so that I can use all of clojure's abstractions when it comes to maps, such as assoc
, count
, etc. In order to do that, I need to extend clojure's clojure.lang.IPersistentMap
protocol to my new sorted map type.
My question is this: What does assocEx
do, or what is its purpose? Calling it on a normal clojure map shows that it differs from assoc
in that it throws an exception if you try to insert a key/value pair where the key already exists in the map:
user> (.assocEx (cast clojure.lang.IPersistentMap {:a :b}) :a 1)
RuntimeException Key already present clojure.lang.Util.runtimeException (Util.java:219)
This is different from assoc
, which simply replaces the old value in the map with the new one:
user> (.assoc (cast clojure.lang.IPersistentMap {:a :b}) :a 1)
{:a 1}
But I can't seem to find a "clojure" function (one where the interop form/cast is not used above) that displays this functionality. Where do we see the effects of this function using the normal clojure abstraction functions like assoc
?
Nothing ever uses assocEx
anymore. It is a remnant of an earlier time. If you are writing your own map type, you can implement (assocEx [m k v] (throw (Exception.)))
.