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

欢迎!请参阅 关于 页面以获取更多有关此页工作的信息。

0
命名空间和变量

问题:提供 DSL 库(如 core.matrix)通常会替换或扩展核心中的函数(如 "+", "==", "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

我不知道这个想法是否会得到审查,但如果它做到了,我对提出的补丁有一些评论。

新符号 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不兼容,因为tools.namespace假定如果文件中有ns形式,它将是文件中的第一个形式。可以争论说,tools.namespace不应做出这种假设,但目前它是这样做的。

也许应该像clojure.compile.warn-on-reflection一样有一个命令行选项clojure.compile.warn-on-replace(在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形式上已经有了足够的麻烦,我们没有必要再加麻烦了 :-)

作为另一种解决方案:我个人并不介意库的作者能否向符号添加一些元数据(例如):"^: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报告)
...