在 ClojureScript 中,对来自 cljs.core 的符号使用 {{ns-unmap}} 不会将其从当前命名空间中排除。请注意,即使取消映射,函数和宏仍然存在
要退出,请输入::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) ;; 宏为 null user=> (ns-unmap 'user 'not) ;; 函数为 null 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}}。