The story of Clojure Var's - part 2
May 15, 2010
Clojure `vars' have many other interesting features. For example, in the code snippet given below:
(def k 10) (defn foo  (binding [k 2] (+ k 3))) ; returns 5
We are `binding' the var k to value 2 within function `foo' - this is completely different from doing `(def k 2)' within `foo' because we are now assigning a different value for the var `k' which is visible only within function `foo' - this `binding' does not in any way affect the global, `root binding' of the var, which still remains as 10.
Bindings have `dynamic scope'. Let's find out what this means.
(def k 10) (defn fun1  (+ k 5)) (defn fun2  (binding [k 100] (fun1))) ; returns 105
In a statically scoped language, function `fun1' should always return 15, whether it is called directly or from some other function. But we see that when `fun1' is called from `fun2' (after having created a new binding for k), it sees 100 as the value for `k'. This shows that bindings have dynamic scope.
A `var' need not always have a root binding; thus, you can do:
(def T) ; (+ T 2) will not work - no value for T (defn foo  (binding [T 10] (+ T 2))) ; returns 12