On p72 in Joy of Clojure
:
Lisp-1 uses the same name resolution for function and value bindings... Because the same name-resolution scheme is used for functions and their arguments, there's a real possibility of shadowing existing functions with other locals or Vars.
So shadowing(or rebinding) vars is possible, like in your code:
(defn m ...)
(def m (memoize m))
(memoize m)
returns the memoized version of function and this function is re-bound(override) to m
. That's it.