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 : 变量 #'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))
;;=> 废弃警告:加载已废弃的命名空间 `foo` 来自命名空间 `bar`


*补丁:* 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_

* 在core.clj的第一个更改中,{{if}}应该替换为{{when}}。
* 命名空间弃用警告能否包括更多关于它发生的地方的信息?
* 我在手动测试中很难重现弃用的ns警告(见下文)。绑定+printf似乎有一些奇怪的地方,因为条件似乎已经满足。我想这与{{\*err*}}有关?看起来在{{(println "Warning: loading deprecated ns" 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构建本身(在build.xml中)中打开warn-on-deprecated。
* 如果你那样做,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)被标记为弃用

* 标记clojure.parallel为在ns元数据中弃用。
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这样的工具,它可以警告我们关于过时函数/变量使用的情况。


在本地/开发时间,您可以使用clojure-lsp(它使用clj-kondo)在IDE级别进行警告。

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


我觉得没有必要将其添加到编译器中。

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