(def a)会破坏#'a元数据,请检查这个
(def ^:mykey a 1)
(meta #'a) ;; sx, :mykey 存在
(let [v (def a)]
[(meta v) ;; 未存在 :mykey,元数据已破坏
(identical? v #'a) ;; true,我们谈论的是同一个变量
])
(meta #'a) ;; 未存在 :mykey
如果这不是一个错误而是一个“功能”,那么我们至少有两个问题
1- def 特殊形式文档根本未说明这种行为,需要澄清。根据现有文档,似乎进行带有无初始化的 def 不会产生任何副作用,但这并不适用于变量元数据。
2- defmulti 使用此形式查找变量并检查它是否已绑定到 MultiFn,如果是这样的话,那么 defmulti 什么也不做...但实际上它做了,在所谓的非破坏性检查中,defmulti 会破坏原始变量的元数据。这是相关的 defmulti 代码片段
(let [v# (def ~mm-name)]
(when-not (and (.hasRoot v#) (instance? clojure.lang.MultiFn (deref v#))))
...