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

欢迎!请查看关于页面以了解更多关于此工作如何运作的信息。

0
命名空间和相关变量

问题:提供领域特定语言(如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中wait-on-reflection的add-doc-and-meta以获取复制和编辑的示例。

在Namespace.java中检查WARN_ON_REFLECTION以发出警告之前,而不是WARN_ON_REPLACE。

ns_libs.clj 中的测试描述可能存在错误:或许应该是“在 clojure.core 中的符号”而不是“符号是 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

已附上更新的补丁。

如果这是控制警告的 preferred 策略,那么 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

和以前一样,我无法评论对这个issue或这些补丁是否有兴趣,但我可以说,在2014年8月29日对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](https://clojure.atlassian.net/browse/CLJ-1257)(由mikera报告)
...