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 已弃用

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

;; 使用已弃用的命名空间(在加载时)
(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. 我在手动测试中很难重现废弃命名空间的警告(见下方)。绑定+printf似乎有点问题,因为条件看起来已满足。我考虑这可能与flush {{\*err*}}有关?似乎在那里加入{{(println "Warning: 加载废弃命名空间" lib)}}会更好。


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


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

     [java] 废弃警告,clojure/core_proxy.clj:112:75 : 变量#'clojure.core/replicate已被标记为废弃
     [java] 废弃警告,clojure/genclass.clj:149:41 : 变量#'clojure.core/replicate已被标记为废弃
     [java] 废弃警告,clojure/genclass.clj:235:65 : 变量#'clojure.core/replicate已被标记为废弃
     [java] 废弃警告,clojure/test/junit.clj:118:22 : 变量#'clojure.test/file-position已被标记为废弃

在ns元数据中将clojure.parallel标记为废弃。
0

评论人:cezarykosko

上传了一个新的diff文件,解决了评论中提到的问题,并增加了关于宏展开的警告。

然而,关于命名空间废弃的警告,代码只打印了当前命名空间,还不确定是否有适当的方式来获取文件/行组合。

0

评论人:alexmiller

再进行一次(希望是最后一次)修改,我认为就绪了。

  • 鉴于我们现已将范围扩大到覆盖命名空间,因此现在应该更新下warn-on-deprecated的文档字符串。
  • 在废弃的命名空间警告消息中,我们可以将其改为:"废弃警告:从命名空间 bar 加载废弃的命名空间 foo。"
  • 在宏和变量警告中,我们可以将 "被标记为已废弃" 改为 "已废弃" 吗?
  • 清理 test/clojure/test_clojure/compilation/deprecated.clj 中的悬挂括号。

非常感谢对这项工作的努力!!

0

评论人:alexmiller

标记为已预览,以便Rich查看。

0

评论者:simongray

这个功能怎么了?还在继续吗?

0
参考:[https://clojure.atlassian.net/browse/CLJ-706](https://clojure.atlassian.net/browse/CLJ-706) (由 stu 报告)
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
...