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

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

新符号 warn-on-replace 应该有文档和元数据。请参考 core.clj 中的.warn-on-reflection 添加文档和元数据的一个例子。

在 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 的大小写变化),这是一个键/值对的映射,每个键/值对是一个不同的选项。如果确实希望这样控制警告,这可能会更好。

0 投票

评论者:mikera

已附上更新补丁。

如果这是首选的警告控制策略,则 compiler-options 确实可能是一个更好的地方。但在我做出更改之前,我会等待更多的反馈/确认。

0 投票

评论者:alexmiller

(:refer-clojure :exclude (link: + = zero?))是否是一个有效的解决方案?或者你真正关注的是库的消费者吗?

0 投票

评论者:mikera

我主要关注库的消费者。

虽然`:refer-clojure :exclude (link: + = zero?)`作为临时解决方案是可行的,但它对用户来说非常不方便。我们真的应该在内联closing中解决这个问题。在使用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报告)
...