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

欢迎!请查阅关于页面了解更多关于该功能的信息。

0
命名空间和变量 提问者

问题:提供 DSL 库(如 core.matrix)通常会替换或扩展 core 中的函数(如 "+", "==", "zero?"),因为这有利于使用最佳/最习惯性的名称。

目前使用 "use" 导入此类库会导致不想要的警告,如 "WARNING: + already refers to: #'clojure.core/+ in namespace: test.blank, being replaced by: #'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-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

就像以前一样,我无法评论是否有人对这个工单或这些补丁感兴趣,但可以说,在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提供)
...