2024 State of Clojure 问卷调查 中分享您的想法!

欢迎!请参阅 关于 页面以获取更多信息。

0
命名空间与变量

问题:提供 DSL(例如 core.matrix)的库通常会替换或扩展核心(例如 "+"、"=="、"zero?") 中的函数,因为这希望使用最好/最符合习惯的名称。

目前使用 "use" 导入此类库会引发不希望的警告,例如 "WARNING: + already refers to: #'clojure.core/+ in namespace: test.blank, being replaced by: #'clojure.core.matrix/+"。

避免这些警告需要额外的用户努力和样板代码,这对用户来说很令人沮丧,因为他们已经明确要求将整个库导入当前命名空间(即通过 "use" 或 ":refer :all")。

提出的解决方案是引入一个新的 var warn-on-replace,类似于 warn-on-reflection,它允许控制此警告。

14 个答案

0

评论人员:mikera

附加了基本的补丁和测试。

0

评论人员:jafingerhut

我不知道这个想法是否会经过检验,但我对提出的补丁有一些评论。

新符号 warn-on-replace 应该具有文档和元数据。请参阅 core.clj 中 warn-on-reflection 的 add-doc-and-meta 例子进行复制和编辑。

您在 Namespace.java 中检查 WARN_ON_REFLECTION 以发出警告,而不是 WARN_ON_REPLACE。

在 ns_libs.clj 测试描述中的可能错误:可能是 "symbol in clojure.core" 而不是 "symbol is clojure.core"。

如果有人希望在 ns 形式中从 :use 语句中获取警告,使用 patch clj-1257.diff 的唯一方式似乎是在文件中 ns 形式之前执行 (set! warn-on-replace true)。但这与当前版本的 tools.namespace 不兼容,因为它假设 ns 形式是文件中的第一个形式。有人可能会认为 tools.namespace 不应该做出这样的假设,但现在是这样的。

或许应该有一个命令行选项 clojure.compile.warn-on-replace,就像 clojure.compile.warn-on-reflection(在 Compile.java 中搜索 warn-on-replace)一样?

0

评论人员:mikera

感谢 Andy 的反馈!我很快会发布一个更新补丁。

我突然想到,我们可能应该为 Clojure 中的警告实现一种更通用的方法。为每个警告添加新的变量和命令行选项似乎不是一个长期的好策略。但这超出了这个补丁的范围。:-)

0

评论人员:jafingerhut

实际上,有一个名为 compiler-options(在所有相关发生中搜索 compiler-options、COMPILER_OPTIONS 和 compiler_options)的东西,它是一个映射,其中每个键/值对是一个不同的选项。如果确实希望使用 warn-on-replace,这可能更合适。

0

评论人员:mikera

更新后的补丁已附加。

如果这是控制警告的首选策略,那么 compiler-options 可能确实是放置该选项的更好地方。但在我做出更改之前,我将等待更多的反馈/确认该方法的正确性。

0

评论者:alexmiller

(:refer-clojure :exclude (link: + = zero?)) 是否是一种有效的折衷方式?或者,你真的关心图库的使用者吗?

0

评论人员:mikera

我主要关心图库的使用者。

虽然`:refer-clojure :exclude (link: + = zero?)`作为临时解决方案是可行的,但对于用户来说非常不方便。我们真正应该修复Clojure本身。用户在使用ns形式时已经足够麻烦了,不必再增添困扰。

作为替代解决方案:如果库的作者能在符号中添加一些元数据(例如quence "^:replace-symbol"),来表示库函数旨在替换核心中的某些内容,我个人并不介意。这是一个略有不同的方法(我认为实施起来会稍微复杂一些),但也应该可行。

0

评论人员:mikera

用户因为这个原因报告的示例问题

https://github.com/mikera/vectorz-clj/issues/23

0

评论人员:jafingerhut

就像以前一样,我无法评论对此问题或这些补丁是否有兴趣,但可以说,在2014年8月29日对Clojure进行了某些提交之后,所有日期截止到2013年9月7日及以前的补丁在最新主分支上不再干净地应用。在那一天之前它们是干净的。

我还没有检查更新此补丁是否容易或困难。

0

评论人员:mikera

我很乐意更新补丁,只需要反馈哪种方法/解决方案为此问题更受欢迎。

我真的希望在1.7版本中看到这个。

0

评论者:alexmiller

将CLJ-1746链接为相关项目。

0

评论者:jmromrell

这有什么进展吗?我正在尝试解决来自monger等库的类似警告。

0

评论者:alexmiller

看起来这个补丁从来没有在最近的讨论中更新过,所以它从未被筛选过。我认为我会跟随 **warn-on-reflection** 的路径,而不是编译器选项。

0
by
参考: https://clojure.atlassian.net/browse/CLJ-1257(由mikera报告)
...