在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) 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-unmap}}中使用它。如果不希望增强{{ns}},补丁0002将{{ns-unmap}}更改为直接更新{{:excludes}}。