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

欢迎!请参阅关于页面以获取更多关于此的信息。

0
Clojure

在数值代码中,用增强版本的clojure.core函数替换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
参考:https://clojure.atlassian.net/browse/CLJ-1592(由mikera报告)
...