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) ;; 宏为 null user=> (ns-unmap 'user 'not) ;; 函数为 null 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 撰写

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

0

评论由:[email protected] 撰写

ns 表单的 own :refer-clojure :exclude 接受任意符号并将它们添加到命名空间的 :excludes 集合中,这似乎存在相同的权限问题。您是否希望在这次任务中修复 ns 和 ns-unmap 的权限问题,或者应该在一个新的任务中提出这样的补丁?

0

评论由:dnolen 撰写

创建一个新任务来解决 {{:exclude}} 不检查 {{cljs.core}} 声明变量的符号列表的 bug,并请在此更新补丁。

0
...