swap! alter and alike
- by mekka
Hello,
I am having a problem understanding how these functions update the underlying ref, atom etc.
The docs say:
(apply f current-value-of-identity args)
(def one (atom 0))
(swap! one inc) ;; => 1
So I am wondering how it got "expanded" to the apply form. It's not mentioned what exactly 'args' in the apply form is. Is it a sequence of arguments or are these separate values?
Was it "expanded" to:
(apply inc 0) ; obviously this wouldnt work, so that leaves only one possibility
(apply inc 0 '())
(swap! one + 1 2 3) ;; #=> 7
Was it:
(apply + 1 1 2 3 '()) ;or
(apply + 1 [1 2 3])
(def two (atom []))
(swap! two conj 10 20) ;; #=> [10 20]
Was it:
(apply conj [] [10 20]) ;or
(apply conj [] 10 20 '())
If I swap with a custom function like this:
(def three (atom 0))
(swap! three (fn [current elem] (println (class elem))) 10) ;;#=> java.Lang.Integer
Which means that the value '10' doesnt magically get changed into a seq '(10)
and leads me to the conclusion, that it gets "expanded" to:
(apply f current-value-of-identity arg1 arg2 arg3... '())
Is that a correct assumption and the docs are simply lacking a better description?