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

欢迎!请访问 关于 页面以了解如何使用本站的具体信息。

0
Clojure

在数值代码中,通常很有用且符合惯例用增强版本(例如,clojure.core.matrix.operators 以数组的方式定义 +,而不是仅对标量数字)代替 clojure.core 函数。

目前看来,当库这样做时,在客户端代码中似乎没有避免警告的方法,例如:

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

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

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

建议的解决方案是允许变量以附加元数据(例如,^: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 的努力中,我正在尝试一些编码示例,并希望针对指定读取 from * 的功能的不同版本运行(和时间)各种测试用例。因此,我迅速将一个类似 bash-shell 的命名空间拼凑起来,定义了名为 <>>> 的宏,来进行“明显的”操作(使用相关全局变量绑定到适当打开的文件中执行代码体)。用例如下

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

对于这种情况,也最好避免警告,而不会有人假设该功能/宏是任何命名空间的“直接替代品”。

(是的,我知道我在这里尝试做的是可能不适合普遍消费的,也可能是重复已经存在的某个功能....)

0
参考资料:https://clojure.atlassian.net/browse/CLJ-1592(由 mikera 提出)
...