Why doesn't defn implicitly name the function to create a named recursion point?
(clojure.walk/macroexpand-all
'(defn foo [x]
(foo x)))
; =>
(def foo
(fn*
([x]
(foo x))))
This could instead expand to
(def foo
(fn* foo ; note the foo here
([x]
(foo x))))
How it works right now, foo resolves to a global var #'foo, which is created when the (def ...) form is analyzed. In the second case, it resolves directly to the function object. Thus, it should save us a var dereference at runtime in this case.
EDIT: Found out, this is exactly what direct linking is used for.