如果您重命名一个核心 Var 并重新定义它,您将收到一个警告。这就像 {{:rename}} 不意味着 {{:exclude}} 一样。
使用 QuickStart JAR 复现
$ java -jar cljs.jar -m cljs.repl.node
ClojureScript Node.js REPL 服务器正在监听 52319
要退出,请输入::cljs/quit
cljs.user=> (ns foo.core (:refer-clojure :rename {map clj-map}))
nil
foo.core=> (map inc [1 2])
(2 3)
foo.core=> (def map {:a :b})
WARNING: map 已经指向 cljs.core/map,并在第 1 行被 foo.core/map 替换 <cljs repl>
#'foo.core/map
foo.core=> map
{:a :b}
foo.core=> (clj-map inc [1 2])
(2 3)
与 Clojure 比较
user=> (ns foo.core (:refer-clojure :rename {map clj-map}))
nil
foo.core=> (map inc [1 2])
编译器异常 java.lang.RuntimeException:无法在这种情况下解析符号:map,正在编译:(/private/var/folders/gx/nymj3l7x4zq3gxb97v2zwzb40000gn/T/form-init8370940485091648461.clj:1:1)
foo.core=> (def map {:a :b})
#'foo.core/map
foo.core=> map
{:a :b}
foo.core=> (clj-map inc [1 2])
(2 3)
请注意,您不能通过在上面的 map 上简单地添加显式的 {{:exclude}} 来解决这个问题。尽管这适用于当前的 ClojureScript 编译器,但它会在 Clojure 中导致别名符号 {{clj-map}} 无法解析。