I'm afraid this use case is an idea of God, not mine, but maybe it will be interesting:
The language itself uses this function in def forms (and the transfer of convenient def macros, including defn and defmacro ), because the metadata attached to the symbols denoting the created Vars is transmitted by Vars themselves. Then it can be used by the compiler and various tools.
You can indicate that defn and Co. optionally accepts an attribute map argument, which is combined into Vars metadata, so using metadata in a symbolic name is optional from the user's point of view. Normal def , however, does not, and internally defn expands to def with metadata coming from the attribute map attached to the Var name itself. (For completeness, you can change the Var metadata map at a separate stage after its creation, but this is not what happens in defn .)
All this is by no means hidden from the programmer. On the contrary, attaching metadata to a symbol “manually” is in many cases shorter than using an attribute map (perhaps you can even say more idiomatic). Clojure's own standard library uses this style (and I mean post-bootstrap) - for example, both clojure.core and clojure.string define Vars with the name replace , but only the latter is marked with the return type (namely String ):
;;; clojure.core (defn replace ...) ;;; clojure.string (defn ^String replace ...)
^String here is converted to {:tag String} , which is attached to the replace character while reading and is later used by the compiler (as a type hint). Other uses include marking Vars as confidential with ^:private (in Clojure 1.3, ^{:private true} in 1.2), attaching docstrings to Vars created with simple def (the only way to do this in 1.2; 1.3 allows for additional docstring argument, but ^{:doc "..."} is still used), etc.
Similarly, in ClojureScript you can have two functions named foo , only one of which must be exported (of course, lives in different namespaces). In this case you will say
(defn ^:export foo ...)
in one namespace and
(defn foo ...)
in another; ^:export translates to ^{:export true} while reading, this is combined into the metadata of this occurrence of the foo character, and then it is read and processed by the ClojureScript compiler.