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

欢迎!请参阅关于页面以了解更多此机制的信息。

0
命名空间和变量

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

当前使用 "use" 导入此类库将产生不想要的警告,如 "WARNING: + 已经在 test.blank 命名空间中引用:#'clojure.core/+,正在被替换为:#'clojure.core.matrix/+"。

避免这些警告需要额外的用户努力和样板代码,这对用户来说很沮丧,因为他们已经明确要求将整个库导入当前命名空间(即通过 "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

评论者: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}")来指示库函数 intended to replace something in core。这是一种稍微不同的方法(我认为实现起来也有点复杂),但这也应该可行。

0

评论者:mikera

用户因此报告的示例问题

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

0

评论者:jafingerhut

和以前一样,我不能评论对这个票据或这些补丁是否有兴趣,但可以说,截至 2014 年 8 月 29 日的 Clojure 提交后,所有截止到 2013 年 9 月 7 日或更早的补丁在将一些补丁应用到 Clojure 后不再干净地应用于最新 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报告)
...