One of the most important features in Clojure is that collections are persistent. That does not mean that they are persistent to disk, it means that you can have several historical versions of a collection with the guarantee that updating or looking for something in any of those versions is going to have the same effort (complexity). You get all this with very little extra memory.
How? It is actually pretty simple. Clojure shares a common structure between several different data structures. If you add a single element to a data structure, Clojure shares the common part between the two structures and keeps track of the differences.
Let's see what we mean with an example:
(def sample-coll [:one :two :three]) (def second-sample-coll (conj sample-coll :four)) (def third-sample-coll (replace {:one 1} sample-coll)) sample-coll ;; [:one :two :three] second-sample-coll ;; [:one :two :three :four] third-sample-coll ;; [1 :two :three :four]
As you can see, when you conj
a new item...