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

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

+5
错误
来自邮件列表 http://groups.google.com/group/clojure/msg/c41d909bd58e4534。在不了解的情况下,很容易使用已弃用的命名空间或变量。文档警告非常小,没有编译器警告。

**建议**:

**添加新的 {{\*warn-on-deprecated*}} 动态变量,默认为 false
当加载具有{{{:deprecated true}}}属性的命名空间时,向标准错误输出警告。
在分析具有{{{:deprecated true}}}属性的变量时,向标准错误输出警告。
当展开具有{{{:deprecated true}}}属性的宏时,向标准错误输出警告。
新的系统属性 clojure.compiler.warn-on-deprecated
使用 clojure.compiler.warn-on-deprecated 编译 Clojure 本身
在 Clojure 内部修复弃用警告(replicate, clear-agent-errors)
使用 :deprecation 标签将 clojure.parallel 标记为已弃用

示例


(set! *warn-on-deprecated* true)

;; 编译时使用已弃用的变量
(defn ^:deprecated f [x] x)
(f 5)
;;=> 弃用警告,NO_SOURCE_PATH:7:1 : var #'user/f is deprecated

;; 宏展开时使用已弃用的宏
(defmacro ^:deprecated m [x] x)
(m 5)
;;=> 弃用警告,NO_SOURCE_PATH:7:1 : macro '#'user/m is deprecated

;; 加载时使用已弃用的命名空间
(ns foo {:deprecated "1.1"})
(ns bar (:require foo))
;;=> 弃用警告:从命名空间 `bar` 中加载已弃用的命名空间 `foo`


**补丁:** 706-deprecated-ns-var-warnings-tested-3.diff

**问题:** 弃用警告的默认值是否应该是 true?升级的用户可能会看到新的警告,可能会令人惊讶。

**默认应该是警告或什么都不警告吗?

25 个回答

0

评论由:alexmiller

在这里有一个折中方案,可以在编译器中将此项默认关闭,但是在工具(如lein)中将它默认打开。但有一点,不管我偏向哪一方,Rich 都可能会根据自己的喜好来做出选择。:)

我认为增加命名空间前缀的复杂性不太可能帮助这个工单向前推进。

0

评论由:cezarykosko

已上传一个由 Luke 合并的 var/ns 相关补丁,并添加了测试。
然而,该补丁并未提醒用户关于已弃用宏,我假设我应该调整它,然后?

此外,我无法修改描述,我该如何处理 Alex 列表中的第一个要点?

0

评论由:jafingerhut

Cezary,我已提高你在 JIRA 上的权限,你应该现在可以编辑工单了。请重新加载页面并重试。

0
_评论由:alexmiller_

1. 在 core.clj 的第一个更改中,{{if}} 应该是 {{when}}。
2. 命名空间弃用警告能否包含更多关于这里发生位置的信息?
3. 我很难在手动测试中重现弃用 ns 警告(见下文)。绑定+printf 似乎有点奇怪,因为条件似乎已经满足。我认为这可能与 {{\*err*}} 的刷新有关?似乎在那里用 {{(println "Warning: loading deprecated ns" lib)}} 会更好。


(set! *warn-on-deprecated* true)
(ns foo {:deprecated true})
(ns bar (:require foo))


4. src/jvm/clojure/lang/Compile.java 需要 clojure.compile.warn-on-deprecated RT 标志的支持。
5. 我认为我们应该在 Clojure 构建本身(在 build.xml 中)开启 warn-on-deprecated。
6. 如果你这样做,Clojure 构建本身存在以下已弃用警告,我们应该修复这些:

    [java] 弃用警告,clojure/core_proxy.clj:112:75 :已弃用 var #'clojure.core/replicate
    [java] 弃用警告,clojure/genclass.clj:149:41 :已弃用 var #'clojure.core/replicate
    [java] 弃用警告,clojure/genclass.clj:235:65 :已弃用 var #'clojure.core/replicate
    [java] 弃用警告,clojure/test/junit.clj:118:22 :已弃用 var #'clojure.test/file-position

7. 在 ns meta 中标记 clojure.parallel 为弃用。
0

评论由:cezarykosko

上传了一个新的差异文件,解决了注释问题,并在宏扩展中都添加了警告。

至于关于命名空间弃用的警告,虽然代码只打印了当前命名空间,但不知道是否有合适的方法来得到文件/行组合。

0

评论由:alexmiller

最后一轮(希望是最后一轮),然后我认为我们就可以通过了。

  • 现在我们已经将作用域扩展到覆盖命名空间,应该更新warn-on-deprecated的文档字符串。
  • 在废弃的命名空间警告信息中,我们能将其改为:“弃用警告:正在从命名空间bar加载弃用的命名空间foo。”吗?
  • 在宏和变量的警告中,我们能将“标记为弃用”改为“已弃用”吗?
  • 清理test/clojure/test_clojure/compilation/deprecated.clj中的悬挂括号。

感谢你们对这项工作的努力!!

0

评论由:alexmiller

为Rich标记为已预筛选。

0

评论者:simongray

这个功能怎么了?还在开发中吗?

0
0

希望能在下一个Clojure版本中看到这个功能。

嗨,Eugen,我们现在有了像clj-kondo这样的工具,它可以警告我们关于过时函数/变量的使用。


在本地/dev环境中,您可以使用clojure-lsp(它使用clj-kondo)在IDE级别上进行警告

在CI中,您可以使用clojure-lsp命令行API,或者将kondo用作代码审查工具。


我看不出为什么需要在编译器中添加这个功能。

https://github.com/clj-kondo/clj-kondo/blob/43f8c0613150e047c73a79ee8adb9f3cc46476de/analysis/README.md#data
...