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_

* 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构建本身中开启warn-on-deprecated(在build.xml中)
* 如果你这样做,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已标记为废弃

* 在ns元中标记clojure.parallel为废弃
0投票

评论人:cezarykosko

上传了新的差异文件,解决了评论,并添加了关于宏展开的警告。

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

0投票

评论者:alexmiller

再来最后一轮(希望是最后一轮),我想我们会没问题

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

非常感谢这项工作!!

0投票

评论者:alexmiller

为 Rich 标记已预审。

0投票

评论者:simongray

这个特性去哪里了?还在开发中吗?

0投票
参考: https://clojure.atlassian.net/browse/CLJ-706 (报告人:stu)
0投票

非常希望看到这个特性在下一个 clojure 版本中出现。

by
Hey 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
...