(def a) destroys #'a metadata, check this:
(def ^:mykey a 1)
(meta #'a) ;; ok, :mykey is present
(let [v (def a)]
[(meta v) ;; NO :mykey present, metadata destroyed
(identical? v #'a) ;; true, we are talking of the same var
])
(meta #'a) ;; NO :mykey present
If this is not a bug but a "feature", then we have at least two problems:
1- The def special form documentation doesn't state this behaviour at all, it needs to be clarified. With the current documentation it seems as doing a def with no init supplied will not make any side-effect at all, and this is not true for the var metadata.
2- defmulti uses this form to lookup the var and check if it already binds to a MultiFn, if that is the case then defmulti does nothing... but it really does something, defmulti will destroy the original var metadata in the (supposedly non-destructive) check. This is the involved defmulti fragment:
(let [v# (def ~mm-name)]
(when-not (and (.hasRoot v#) (instance? clojure.lang.MultiFn (deref v#)))
...