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 ...)来避免此警告,但这会为用户增加不必要的麻烦并要求维护样板代码。

建议的解决方案是使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
参考:[CLJ-1592](https://clojure.atlassian.net/browse/CLJ-1592)(由 mikera 报告)
...