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

欢迎!请参阅 关于 页面以获取更多关于本网站如何工作的信息。

0 投票
Clojure

在数值代码中,通常非常有用且符合惯例的是用增强版本替换 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 ...),但这给用户增加了不必要的麻烦,并需要维护样板代码。

建议的解决方案是允许 var 用附加元数据标注(例如,^:replace-var),当添加到库函数时将抑制此警告。这允许库作者指定一个函数应该作为 clojure.core(或某些其他命名空间)的即插即用替代品,因此不需要警告。

4 个答案

0 投票

评论由:jafingerhut 提出

与 CLJ-1257 相重复?

0 投票

评论由:mikera 提出

嗨 Andy,这指的是同一警告,但解决方案的范畴不同
- CLJ-1257 更像是一种全局方式关闭这个警告
- CLJ-1592 是为了在特定的 vars 上抑制这个警告

如果实现了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 投票
参考:[CLJ-1592](https://clojure.atlassian.net/browse/CLJ-1592)(由mikera报告)
...