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) ;; 宏为 nil user-> (ns-unmap 'user 'not) ;; 函数为 nil user-> (when 1 2) CompilerException java.lang.RuntimeException: Unable to resolve symbol: when in this context, compiling:(NO_SOURCE_PATH:11:1) user-> (not false) CompilerException java.lang.RuntimeException: Unable to resolve symbol: not in this context, compiling:(NO_SOURCE_PATH:12:1)
ClojureScript 的 {{ns-unmap}} 需要将符号添加到当前命名空间的 {{:excludes}} 集中。请注意,特殊形式 {{def}} 已经这样做(并在显示警告后)。
我们有两个解决方案。0001 扩展了 {{ns}} 表达式的 {{:merge}} 行为以支持 {{:excludes}},然后在此中使用它。如果不希望增强 {{ns}},补丁 0002 将 {{ns-unmap}} 更新为直接更新 {{:excludes}}。