(def a) 销毁 #'a 元数据,请查看此内容
(def ^:mykey a 1)
(meta #'a) ;; 好的,存在 :mykey
(let [v (def a)]
[(meta v) ;; 未找到 :mykey,元数据被销毁
(identical? v #'a) ;; true,我们讨论的是相同的变量
])
(meta #'a) ;; 未找到 :mykey
如果不是错误而是“功能”,那么我们至少有两个问题
1- def 特殊形式的文档根本未提到这种行为,这需要明确说明。根据当前的文档,似乎使用无初始化的 def 不会产生任何副作用,而对于 var 元数据来说并非如此。
2- defmulti 使用此形式查找变量并检查它是否已经绑定到 MultiFn,如果是这样,则 defmulti 什么也不做...但实际上会这样做,defmulti 会销毁原始变量的元数据。这就是相关的 defmulti 片段
(let [v# (def ~mm-name)]
(when-not (and (.hasRoot v#) (instance? clojure.lang.MultiFn (deref v#))))
...