销毁#'a元数据,请查看
(meta #'a) ; ok,存在:mykey
(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
如果这不仅仅是一个错误而是一个“特性”,那么我们至少有两个问题
1- def 特殊形式的文档根本没有说明这种行为,需要澄清。按照当前文档,似乎进行一个没有提供初始化值的 def 将不会产生任何副作用,这并不是 var 元数据的真实情况。
2- defmulti 使用此形式来查找变量并检查它是否已经绑定到一个 MultiFn,如果是这样,则 defmulti 不会做任何事情...但实际上它确实做了,defmulti 将在(理论上非破坏性的)检查中销毁原始 var 元数据。这是涉及的 defmulti 片段
(let [v# (def ~mm-name)]
(when-not (and (.hasRoot v#) (instance? clojure.lang.MultiFn (deref v#))))
...