There's metadata on the function func-1
, metadata on the Var #'func-1
, and metadata on the symbol 'func-1
. The Clojure reader macro ^
adds metadata to the symbol, at read time. The defn
macro copies metadata from the symbol to the Var, at compile time.
Prior to Clojure 1.2, functions did not support metadata. In Clojure 1.2, they do, and defn
also copies some standard Var metadata to the function:
Clojure 1.2.0
user=> (defn ^{:foo :bar} func-1 [] nil)
#'user/func-1
user=> (meta func-1)
{:ns #<Namespace user>, :name func-1}
user=> (meta #'func-1)
{:foo :bar, :ns #<Namespace user>, :name func-1, ...
However, in current Clojure 1.3 snapshots, defn
does not copy any metadata to the function:
Clojure 1.3.0-master-SNAPSHOT
user=> (defn ^{:foo :bar} func-1 [] nil)
#'user/func-1
user=> (meta func-1)
nil
user=> (meta #'func-1)
{:foo :bar, :ns #<Namespace user>, :name func-1, ...
In general, if you want to get at the metadata of a definition, you want metadata on the Var.