(def a) 会销毁 `'a` 的元数据,请看看这个
(def ^:mykey a 1)
(meta #'a) ;; ok, :mykey 存在
(let [v (def a)]
[(meta v) ;; NO :mykey 存在,元数据已销毁
(identical? v #'a) ;; true,我们在谈论的是同一个变量
])
(meta #'a) ;; NO :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#))))
...