defn
is just a macro:
(macroexpand '(defn helofn [subject]
(str "Hello " subject)))
(def helofn (clojure.core/fn ([subject] (str "Hello " subject))))
If you define helofn
the way you defined helo
, you'll be able to treat it as data:
(def helofn '(fn [subject]
(str "Hello " subject)))
Now you can eval and call this function:
((eval helofn) "world")
and to treat it as a data:
(count helofn)
But, when you use defn
macro you associates helofn
variable with compiled function and not with it's code.
It's not just functions. Let's say you defined hello
with the following code:
(def helo (str "Hello " subject))
Now hello
is associated with "Hello world" string and not with (str "Hello " subject)
code. So, now there is no way to get the code this string was built with.
N.B. If you want to treat clojure code as data you should look into its macros. Any code passed to a macro is treated as data and any data returned by a macro is treated as code.