请分享您的想法在 2024 年 Clojure 状态调查!

欢迎!请参阅 关于 页面以了解有关如何工作的更多信息。

0
命名空间和变量

问题:提供 DSL(如 core.matrix)的库通常替换或扩展核心函数(如 "+", "==", "zero?"),因为这有利于使用最好的/最正宗的名称。

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

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

建议的解决方案是引入一个新的变量 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-reflection的命令行选项clojure.compile.warn-on-replace(在Compile.java中搜索warn-on-replace)?

0
by

评论者:mikera

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

我觉得我们应该为Clojure实现更通用的警告方法。为一个警告添加新的变量和命令行选项似乎不是一个长期的好策略。但我认为这超出了这个补丁的范围。:-)

0
by

评论者:jafingerhut

实际上,有一个叫做compiler-options的东西(搜索compiler-options、COMPILER_OPTIONS和compiler_options的所有相关出现),它是一个映射,每个键/值对代表一个不同的选项。如果确实需要warn-on-replace,这可能更好。

0
by

评论者:mikera

已附上更新后的补丁。

如果这是控制警告的首选策略,则compiler-options看起来确实是一个更好的地方。但我在进行此更改之前将等待更多的反馈/确认。

0
by

评论者:alexmiller

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

0
by

评论者: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

我很乐意更新补丁,只是需要反馈关于哪个方法/解决方案是 preferred 的。

我真的希望能在1.7中看到这个功能!

0

评论者:alexmiller

关联到CLJ-1746作为相关请求。

0

由jmromrell发表的评论:

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

0

评论者:alexmiller

看起来补丁从未从关于当前补丁的最后讨论中更新过,因此从未经过筛选。我认为我会选择 **warn-on-reflection** 的路径,而不是编译器选项。

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