在数值代码中,用增强版本的clojure.core函数替换clojure.core函数通常很有用且符合惯用法(例如,clojure.core.matrix.operators中的+定义了一种适用于整个数组的操作方式,而不仅仅是标量数字)
目前似乎没有方法在客户端代码中避免在此类操作时出现警告,例如
`
;; 库命名空间
(ns foo
(:refer-clojure :exclude [+]))
(def + clojure.core/+)
;; 在稍后的某个命名空间中
(require '[foo :refer :all])
=> 警告:+已经在命名空间:bar中引用:#'clojure.core/+,现在正被替换为:#'foo/+
`
有一种解决方案,即在用户命名空间中使用(:refer-clojure :exclude ...),但这会给用户带来不必要的麻烦,并需要维护样板代码。
建议的方案是允许var被附加额外的元数据(例如,^:replace-var),当附加到库函数上时,将抑制此警告。这将允许库作者指定函数应作为clojure.core(或某个其他命名空间)的替换项运行,因此不需要警告。