Uploaded image for project: 'Clojure'
  1. CLJ-1446

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

    Details

    • Type: Improvement
    • Status: Open
    • Priority: Minor
    • Resolution: Unresolved
    • Affects versions: Release 1.6
    • Fix versions: None
    • Labels:
      None
    • Approval:
      Triaged

      Description

      (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#)))
         ...
      

        Attachments

          Activity

            People

            • Assignee:
              Unassigned
              Reporter:
              nahuel nahuel
            • Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

              • Created:
                Updated: