ClojureScript 中,使用 {{ns-unmap}} 断开 {{cljs.core}} 中符号的引用不会将其排除出当前命名空间。请注意,即使在断开映射后,一个函数和一个宏仍然存在。
要退出,请输入::cljs/quit cljs.user=> (ns-unmap 'cljs.user 'when) ;; 宏 true cljs.user=> (ns-unmap 'cljs.user 'not) ;; 函数 true cljs.user=> (when 1 2) 2 cljs.user=> (not false) true
这与 Clojure 的 {{ns-unmap}} 的行为不同。请注意尝试使用未映射的符号时出现的适当错误。
Clojure 1.7.0-beta1 user=> (ns-unmap 'user 'when) ;; 宏 nil user=> (ns-unmap 'user 'not) ;; 函数 nil user=> (when 1 2) 编译器异常 java.lang.RuntimeException: 无法在此上下文中解析符号:when,编译:(NO_SOURCE_PATH:11:1) user=> (not false) 编译器异常 java.lang.RuntimeException: 无法在此上下文中解析符号:not,编译:(NO_SOURCE_PATH:12:1)
ClojureScript 的 {{ns-unmap}} 需要将符号添加到当前命名空间的 {{:excludes}} 集合中。请注意,{{def}} 特殊形式已经在显示警告后这样做。
我们有两种解决方案。0001 将 {{ns}} 表达式的 {{:merge}} 行为扩展到支持 {{:excludes}},然后在 {{ns-unmap}} 中使用此功能。如果不希望增强 {{ns}},则补丁 0002 将 {{ns-unmap}} 更改为直接更新 {{:excludes}}。