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

欢迎!请查看 关于 页面以获取有关此功能更多详细信息。

0
ClojureScript

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

4 个回答

0

评论由:dnolen 提出

首选第二个补丁。但是,它似乎太宽容了。只有在符号标识核心宏或 fn 时,才应应用 {{:excludes}} 逻辑。

0

评论由:[email protected] 提出

ns表单的:refer-clojure :exclude接受任意符号并将它们添加到命名空间的:excludes集合中,这看起来像是同样的权限问题。您想要在这个问题中解决这个问题,还是要将其作为一个新问题的补丁?

0

评论由:dnolen 提出

创建一个新问题以修复{{:exclude}}没有检查由{{cljs.core}}声明的符号列表的bug,并请在此处更新补丁。

0
...