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

欢迎!有关本网站如何工作的更多信息,请参阅 关于 页面。

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

建议:

添加新的 {{\*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 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构建本身(在build.xml中)打开warn-on-deprecated
* 如果你这样做,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" 的文档字符串。
  • 在弃用命名空间的警告消息中,我们可以将其修改为:"弃用警告:从命名空间 bar 加载已弃用的命名空间 foo。"。
  • 在宏和变量警告中,我们可以将 "标记为已弃用" 改为 "已弃用" 吗?
  • 清理 test/clojure/test_clojure/compilation/deprecated.clj 中的悬挂括号。

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

0

评论由: alexmiller 发布

标记供Rich查看。

0

评论者:simongray

这个特性怎么了?它还会到来吗?

0
0
已回答 Eugen Stan

很希望在下一次clojure版本中看到这个。

评论 Enzzo
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
...