2024 Clojure 状况调查 中分享你的想法!

欢迎!请查看 关于 页面以了解更多关于如何使用本网站的信息。

0
命名空间和变量

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

目前,使用"use"导入此类库会导致不希望出现的警告,如“WARNING: + 已经在命名空间:test.blank 中引用:#'clojure.core/+,被替换为:#'clojure.core.matrix/+"。

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

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

14 个答案

0

评论者:mikera

附加了基本补丁和测试。

0

评论者:jafingerhut

我不知道这个想法是否会被审核,但如果会被审核,我有关于提议的补丁的一些评论。

在 core.clj 中,新的标记 warn-on-replace 应该有其文档和元数据。请参考 core.clj 中的 warn-on-reflection 以添加文档和元数据的例子。

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

在 ns_libs.clj 中测试描述中可能有误:可能是“符号在 clojure.core 中”而不是“符号是 clojure.core”。

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

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

0

评论者:mikera

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

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

0

评论者:jafingerhut

实际上,有一个名为compiler-options的东西(搜索所有相关的compiler-options、COMPILER_OPTIONS和compiler_options变体),它是一个键值对映射,其中每个键值对代表不同的选项。如果确实希望控制警告,这可能比warn-on-replace更可取。

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

与前文相同,我无法评论对这个工单或这些补丁是否有人感兴趣,但我可以说,所有在2013年9月7日及之前发出的补丁在2014 年8月29日Clojure提交一些更改后已不再干净地应用到最新的master上。在此之前,它们是干净地应用的。

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

0

评论者:mikera

我很乐意更新这个补丁,只需要反馈哪些方法/解决方案更受欢迎。

我真的希望能在1.7版本中实现这个功能!

0

评论人:alexmiller

链接到CLJ-1746作为相关内容。

0

评论者:jmromrell

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

0

评论人:alexmiller

看起来这个补丁从最后讨论补丁的情况以来从未更新过,所以它从未 been被审查过。我认为我会选择**warn-on-reflection**路径,而不是编译器选项。

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