2024年Clojure现状调查!中分享您的想法。

欢迎!请参阅关于页面以了解如何使用本站的更多信息。

0
ClojureScript

在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}}。

4 个答案

0

由:dnolen做出的评论

第二个补丁更受欢迎。然而,似乎第二个补丁过于宽容。只有当符号标识核心宏或fn时,才应该应用{{:excludes}}逻辑。

0

由:[email protected]做出的评论

ns表单的:refer-clojure:exclude接受任意符号并将它们添加到命名空间的:excludes集合中,这似乎存在着相同的问题。您想要在此票据中对ns和ns-unmap均进行修复的补丁,还是应该将该补丁放在新的票据中?

0

由:dnolen做出的评论

创建新的票据以修复{{:exclude}}不知如何检查{{cljs.core}}声明的变量列表的bug,并请在此处更新补丁。

0
...