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

欢迎!有关如何操作,请参阅 关于 页面以获取更多信息。

0 投票
Clojure

在数字代码中,通常 Useful 和惯用的做法是用增强版本替换 clojure.core 函数(例如 clojure.core.matrix.operators 以一种与整个数组一起工作的方式定义 +,而不仅仅是标量数字)

看起来目前还没有方法在客户端代码中避免当库这样做时出现警告,例如。

`
;; 库命名空间
(ns foo
(:refer-clojure :exclude [+]))
(def + clojure.core/+)

;; 然后,在其他命名空间中
(require '[foo :refer :all])
=> 警告:+ 已经在命名空间 bar 中引用:'#clojure.core/+,被替换为:'#foo/+
`

使用用户命名空间中的 (:refer-clojure :exclude ...) 有一个解决方案,但这会给用户带来不必要的麻烦,并且需要维护样板代码。

建议的解决方案是允许将 vars 与附加元数据(例如 ^:replace-var)进行注解,当将该元数据添加到库函数中时,将抑制此警告。这将允许库作者指定函数应以 clojure.core(或某个其他命名空间)的替换件工作,因此不需要警告。

4 个答案

0 投票

评论者:jafingerhut

与 CLJ-1257 重复吗?

0 投票

评论者:mikera

嗨 Andy,它指向相同的警告 - 但解决方案的范围不同
- CLJ-1257 更像一个全局的方式关闭这个警告
- CLJ-1592 是用于屏蔽特定变量的此警告

如果实现了 CLJ-1257 且默认关闭警告,CLJ-1592 就变得基本没有必要。如果没有 CLJ-1257 或警告默认开启,则需要 CLJ-1592。

0 投票

评论者:jcburley

另一个可能存在争议的场景是定义一个或宏,其名称与 clojure.core 中的某些内容相同,但不打算作为直接替换,而是某种完全不同的东西。

例如,在我早期的 Clojure 学习努力中,我正在尝试一些编码示例,并希望对指定从 * 读取的功能的不同版本运行(并计时)各种测试用例。所以我抛出一个类似 bash-shell 的快速命名空间,定义了名为 <、> 和 >> 的宏,以执行“显然”的事情(使用与相应全局变量绑定的主体代码)。用例类似于

(require ['com.burleyarch.bash :as bash]) (bash/< "path-to-input-file" (read-line))

最好避免为此情况发出警告,同时没有人假设函数或宏是为了替代任何命名空间而设计的。

(是的,我意识到的做法可能不适合一般使用,或者已经存在的内容重复....)

0 投票
参考: https://clojure.atlassian.net/browse/CLJ-1592 (由 mikera 报告)
...