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

欢迎!请参见 关于 页面,了解更多关于该功能的详细信息。

+5
错误
来自邮件列表 http://groups.google.com/group/clojure/msg/c41d909bd58e4534。在不自知的情况下,很容易使用过时的命名空间或 vars。文档警告很小,而且没有编译器警告。

*建议:*

* 添加新的 {{\*warn-on-deprecated*}} 动态变量,默认值设置为 false
* 当加载 {{{:deprecated true}}} 命名空间时向 stderr 报警。
* 当分析 {{{:deprecated true}}} 变量时向 stderr 报警。
* 当展开 {{{:deprecated true}}} 宏时向 stderr 报警。
* 新系统属性 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

* 核心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构建本身中打开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

上传了新的差异,解决了评论问题,并增加了宏展开警告。

然而,在命名空间弃用警告方面,代码仅打印当前命名空间,不知道是否有适当的方法来获得文件/行组合。

0
by

评论由:alexmiller 撰写

再进行一轮(希望是最后一轮)之后,我认为我们就没问题了。

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

非常感谢您在这项工作上所做的努力!!

0
by

评论由:alexmiller 撰写

为 Rich 打标记以便查看。

0
by

评论由:simongray 提出

这个功能怎么了?它还在进行中吗?

0
by
参考:[https://clojure.atlassian.net/browse/CLJ-706](https://clojure.atlassian.net/browse/CLJ-706)(由 stu 报告)
0
by

很希望能在下一个 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
...