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

欢迎!请参阅 关于 页面,了解更多关于如何使用本站的信息。

0
命名空间和变量

问题:提供 DSL(如 core.matrix)的库通常替换或扩展核心(如 "+", "==", "zero?")中的函数,因为这更符合最佳或者最直观的使用名称。

目前使用 "use" 导入此类库会产生不希望的警告,例如 "WARNING: + 已经指的是:#'clojure.core/+ 在命名空间:test.blank,被替换为:#'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语句获取警告,似乎在补丁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

附上更新补丁。

如果这是控制警告的首选策略,那么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](https://clojure.atlassian.net/browse/CLJ-1257)(由 mikera 报告)
...