(def a) 会销毁#'a 元数据,请检查这个
(def ^:mykey a 1)
(meta #'a) ;; 正确,:mykey 存在
(let [v (def a)]
[(meta v) ;; 没有 :mykey,元数据被销毁
(identical? v #'a) ;; true,我们谈论的是同一个 var
])
(meta #'a) ;; 没有 :mykey 存在
如果这不是一个错误而是一个“特性”,那么我们至少有两个问题
1- def 特殊形式的文档完全没有说明这种行为,需要澄清。根据目前的文档,似乎执行一个不带初始化的 def 不会产生任何副作用,这不是 var 元数据的真实情况。
2- defmulti 使用这个形式来查找 var 并检查它是否已绑定到 MultiFn,如果是这种情况,则 defmulti 什么也不做...但实际上它会做,defmulti 将在(假定为无副作用的)检查中销毁原始 var 元数据。这是相关的 defmulti 片段
(let [v# (def ~mm-name)]
(when-not (and (.hasRoot v#) (instance? clojure.lang.MultiFn (deref v#))))
...