在数值代码中,通常非常有用且符合惯例的是用增强版本替换 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(或某些其他命名空间)的即插即用替代品,因此不需要警告。