We're updating the issue view to help you get more done. 

(def v) with no init supplied destroys #'v metadata

Description

(def a) destroys #'a metadata, check this:

1 2 3 4 5 6 7 8 9 10 (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:

1 2 3 (let [v# (def ~mm-name)] (when-not (and (.hasRoot v#) (instance? clojure.lang.MultiFn (deref v#))) ...

Environment

None

Status

Assignee

Unassigned

Reporter

nahuel

Labels

None

Approval

Triaged

Patch

None

Affects versions

Release 1.6

Priority

Minor