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
by

评论由: alexmiller

在这里有一个折中的方案,可以在编译器中默认关闭它,但在工具(如lein)中默认打开。但是我有一种合理的机会,无论我更喜欢什么,Rich都将有自己的偏好,当它到他那里时将超越它。 :)

我认为围绕命名空间前缀创建更多复杂性不太可能有助于推进这个项目的进展。

0
by

评论由: cezarykosko

上传了一个由Luke合并的var/ns补丁,并添加了测试。
但是,这个补丁并没有警告用户关于已废弃的宏,我猜想我应该调整它,对吗?

此外,我无法调整描述,我该如何处理Alex列表中的第一点?

0
by

评论由: jafingerhut

Cezary,我已经提高你在JIRA的权限,你现在应该能够编辑票据。请重新加载页面并再次尝试。

0
by
_评论由: 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

再来一次(希望是最后一轮)后,我想我们可以结束了。

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

感谢对这个工作的付出!!

0

评论由: alexmiller

标记为已经筛选,供Rich审查。

0

评论人:simongray

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

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