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

欢迎!请查阅关于页面获取如何使用此工具的更多详细信息。

+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 :变量#'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警告(见下文)。似乎在binding+printf中有一些奇怪之处,因为条件似乎已满足。我想这与flush {{\*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

上传了一个新的diff,解决了评论并增加了宏展开警告。

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

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这样的工具,它会提醒我们关于弃用的函数/变量的使用。


在本地/devtime,您可以使用clojure-lsp(它使用clj-kondo)在IDE级别进行提醒。

在CI中,您可以使用clojure-lsp命令行API,或者将kondo作为codelinter使用。


我认为没有理由将其添加到编译器中。

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