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

欢迎!请参阅关于页面以获取有关如何使用的更多信息。

0
命名空间和变量

问题:提供DSL库(如core.matrix)的库往往替换或扩展核心函数(例如“+”,“==”,“zero?”),因为这有利于使用最好的/最符合习惯的名称。

目前使用“使用”导入这类库会导致不想要的警告,例如“WARNING:+已引用:#'clojure.core/+ 在命名空间:test.blank,被替换为:#'clojure.core.matrix/+"。

避免这些警告需要额外的用户努力和样板代码,这对用户来说是令人沮丧的,因为他们已经明确要求将整个库导入到当前命名空间(即通过“使用”或“:refer :all”)。

建议的解决方案是引入一个新的变量warn-on-replace,类似于warn-on-reflection,它允许控制此警告。

14 个答案

0

由:mikera发表的评论

附带了基本补丁和测试。

0

由:jafingerhut发表的评论

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

新的符号warn-on-replace应该有doc和元数据。请参见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-replace,就像clojure.compile.warn-on-reflection一样(在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发表的评论

与之前一样,我无法评论对这个技术债务单或这些补丁是否有兴趣,但我可以说,所有在2013年9月7日或之前发布的补丁,在2014年8月29日Clojure提交了一些更改之后,就不再同最新的 mastery 一致应用了。它们在此之前是一致的。

我还没有检查更新这个补丁可能有多容易或有多困难。

0

由:mikera发表的评论

我很乐意更新这个补丁,只需要反馈关于哪种方法/解决方案更受欢迎。

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

0

评论者:alexmiller

链接到CLJ-1746,表示相关问题。

0

由:jmromrell 评论

这个问题有什么进展吗?我正在尝试解决来自monger和其他库中的类似警告。

0

评论者:alexmiller

从上次关于当前补丁的讨论以来,看起来补丁从未被更新过,所以它从未被审查过。我认为我会遵循 **warn-on-reflection** 的路径,而不是编译器选项。

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