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

欢迎!有关此网站的更多信息,请参阅 关于 页面。

0
命名空间和变量

问题:提供 DSL 的库(如 core.matrix)经常替换或扩展核心函数(如 "+"、"=="、"zero?"),因为这有助于使用最合适/最习惯的名称。

目前使用 "use" 导入此类库会引发不必要的警告,如“WARNING: + 已经引用: #'clojure.core/+ 在命名空间: test.blank,被替换为: '#'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 的唯一方法是先在文件中某个位置设置 (set! warn-on-replace true),这个位置应当在 ns 表单之前。但这可能不会与当前版本的 tools.namespace 一起很好地工作,因为 tools.namespace 假设如果存在 ns 表单,它将是文件中的第一个形式。有人可能会说,tools.namespace 不应该做这样的假设,但现在它确实这样做了。

也许应该有一个类似于 clojure.compile.warn-on-reflection 的命令行选项 clojure.compile.warn-on-replace(在 Compile.java 中搜索 warn-on-replace)?

0

以下是 mikera 的评论:

感谢 Andy 提供反馈!我将很快发布一个新的补丁。

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

0

以下是 jafingerhut 的评论:

实际上,有一个叫做 compiler-options 的东西(搜索所有与 compiler-options, COMPILER_OPTIONS 和 compiler_options 相关的出现)是一个键/值对映射,每个键/值对都是不同的选项。如果确实想要这样控制警告,这可能更好。

0

以下是 mikera 的评论:

附上更新后的补丁。

如果这正是控制警告的首选策略,那么编译器选项看起来可能确实是一个更好的地方。但在做出这一更改之前,我将等待更多的反馈/确认。

0

评论人:alexmiller

(:refer-clojure :exclude (link: + = zero?)) 是一个有效的解决方案吗?或者你是否真正关心库的用户?

0

以下是 mikera 的评论:

我主要关心库的用户。

因此,虽然(:refer-clojure :exclude (link: + = zero?))作为一种临时解决方案是可能的,但对于用户来说非常不便。我们真的应该在Clojure本身中解决这个问题。用户在使用ns表单已经足够麻烦了,不用再去增加他们的困难了:-)

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

0

以下是 mikera 的评论:

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

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

0

以下是 jafingerhut 的评论:

就像之前一样,我不能评论是否有人对此请求或这些补丁感兴趣,但我可以说,在2014年8月29日对Clojure进行一些提交之后,所有日期为2013年9月7日及以前的补丁在后续实例中都不再能够干净地应用到最新的master版本。在那一天之前,它们是可以干净地应用的。

我还没有检查更新这个补丁可能有多容易或困难。

0

以下是 mikera 的评论:

我很愿意更新补丁,只需要反馈关于哪种方法/解决方案更受推崇。

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

0

评论人:alexmiller

链接到CLJ-1746作为相关条目。

0

评论由:jmromrell

这件事情有没有结果?我在尝试解决monger等库中的类似警告。

0

评论人:alexmiller

看起来补丁从未根据关于当前补丁的最后一轮讨论进行更新,所以它从未经过筛选。我认为我会遵循 **warn-on-reflection** 的路径,而不是编译器选项。

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