替换在 cljs.core 中定义的符号工作正常,并会显示预期的警告。其中一个失败的情况是当一个被替换的符号最初是一个宏,并且未使用命名空间限定符调用它。示例:
`
}
;;;;;;; 文件 a ;;;;;;
(ns file.a)
(defn + [& vals]
(prn "Called!")
(apply cljs.core/+ vals))
;;;;;;; 文件 b ;;;;;;
(ns file.b
(:require [file.a :refer [+]]))
(+ 1 2 ) ;; 不打印 "Called!"
(file.a/+ 1 2) ;; 打印 "Called!"
(var +) => file.a/+
+ 1 2
;; 打印 "Called!" ``
}
在文件 b 中单独的符号 +
调用 cljs.core/+,尽管它被引用并且所有变量解析都解析到 file.a/+.这在从 cljs.core 中覆盖函数的情况下并不适用,例如覆盖函数 map
也可以正常工作。
`
;;;;;;; 文件 a ;;;;;;
(ns file.a)
(defn map [f coll]
(prn "map called!")
(cljs.core/map f coll))
;;;;;;; 文件 b ;;;;;;
(ns file.b
(:require [file.a :refer [map]]))
(map inc [1 2 3]) => "map called!" (2 3 4)
`
}