请在 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) 编译器异常 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}}。

4 答案

0

评论者:dnolen

更喜欢第二个补丁。然而,第二个补丁似乎太过宽容。只有在符号标识核心宏或函数时,才应应用 {{:excludes}} 逻辑。

0

评论人:[email protected]

ns 表单的 :refer-clojure :exclude 接受任意符号,并将它们添加到命名空间的 :excludes 集合中,这个问题很像是同一个权限问题。您是否希望在这个工单中对 ns 和 ns-unmap 的权限问题进行修复,或者应该在一个新的工单中修复这样的补丁?

0

评论者:dnolen

新建工单以修复 {{:exclude}} 不检查 {{cljs.core}} 声明的符号列表的 bug,请在此处提供更新后的补丁。

0
...