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 已废弃

;; 使用废弃的宏(在宏展开时)
(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 吗? nâng cấp 容易看到新警告,这可能会令人惊讶。

**废弃应该默认为警告或不应警告吗?

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: 变量#'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

评论由:alexmiller 发布

再来一次(希望是最后一次),然后我认为我们就准备好了

  • 由于我们的范围已经扩大到包括ns,现在应该更新 warn-on-deprecated 的 docstring。
  • 在过时的 ns 警告信息中,我们能否将其改为: "弃用警告:从命名空间 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 版本中出现。

嗨 Eugen,我们现在有像 clj-kondo 这样的工具,它警告我们关于已弃用的函数/变量的使用。


在本地/开发时间内,你可以使用 clojure-lsp(它使用 clj-kondo)在 IDE 级别进行警告。

在持续集成中,你可以使用 clojure-lsp 命令行 API,或 kondo 作为代码检查工具。


我没有任何理由要把这个添加到编译器中。

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