请在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))
;;=> 弃用警告:在命名空间`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
by

评论者:alexmiller

再进行一次(希望是最后一次)round,然后我认为我们就可以了

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

感谢你在这项工作上的努力!!

0
by

评论者:alexmiller

为Rich预筛选。

0
by

评论者:simongray

这个特性怎么了?还会出吗?

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