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

评论者: richhickey

我不介意在 stderr 上警告

0

评论由:lvanderhart发表

706-deprecated-var-warning.diff在使用弃用变量时会添加警告。其他三个补丁清理了弃用警告。

0

评论由:jafingerhut发表

很不错。我查看了第一个补丁,但没有看到里面有什么让某人能够从命令行禁用弃用警告的功能,就像现在的warn-on-reflection可以通过命令行选项设置为true一样。

这对于弃用警告来说是一个重要的功能吗?

0

评论由:jafingerhut发表

我希望能快速简单地添加源文件、行和列信息到弃用警告消息中。这并不像添加到format()调用中那样简单,因为analyzeSymbol方法不接受这些值作为参数。这个弃用检查是在一个不容易与源文件、行和列关联的地方进行的吗?能否在一个更容易获得这些信息的地方进行?

0

评论由:gshayban发表

另一个补丁——这次是在加载弃用命名空间时发出警告,而不是变量。这个补丁需要第一个补丁。

关于行/列:我会尽力实现传递编译上下文。

关于编译标志:我也为此补丁制作了一个,但我还在验证如何调用。如何通过命令行设置warn-on-reflection?

0

评论由:jafingerhut发表

关于编译标志:如果你想要实现,不要推迟,但也许值得听听其他人的意见,是否真的需要这样的命令行选项。我提问的目的是希望能得到这样的回应。

关于在Clojure编译器中的处理方式,请在Compile.java中搜索REFLECTION_WARNING_PROP和相关代码。如果您直接通过Java命令行调用Clojure编译器,请使用-Dclojure.compile.warn-on-reflection=true(默认为false)。如果您想了解通过ant或Maven的方式,请参阅Clojure开发者Google群组最近发送的邮件线程。链接:[https://mail.google.com/mail/?shva=1#label/clojure-dev/13aa0e34530196c3](https://mail.google.com/mail/?shva=1#label/clojure-dev/13aa0e34530196c3)

还有一条单独的命令行标志称为compiler-options(见Compile.java),它是编译器内部实现为一个映射。这是在warn-on-reflection之后增加的,可能是一种添加更多此类选项的首选方法,以避免在多个地方的pushThreadBindings调用中继续添加更多参数。

0

评论由:gshayban发表

谢谢,Andy。

对于最后的ns修补,与调用(print-method msg err)等效,而不是将out绑定到err,可能更容易阅读。如果它更受欢迎,我很乐意发送。

0

评论由:jafingerhut发表

2013年2月12日的706-deprecated-var-warning-patch-v2.txt与2012年10月26日的706-deprecated-var-warning.diff相同,只是它干净地应用于最新的master。

0

评论由:jafingerhut发表

对于任何查看此票据并希望获取此功能的人,Eastwood lint工具报告了对过时的Clojure函数的调用,以及对过时的Java方法的调用。https://github.com/jonase/eastwood

0

评论者:alexmiller

我愿意考虑把它带入Clojure 1.9,但我需要一些帮助来准备。我对当前状态的几点看法:-票据需要了解更多关于当前方案的具体细节

  • 我更喜欢 } 而不是 ,因为这反映了你用来标记过时变量的关键词
  • 警告信息没有告诉你位置,太糟糕了 - 应该类似于反射信息
  • 需要测试 - 参考test/clojure/test_clojure/compilation.clj 和 test/clojure/test_helper.clj (should-not-reflect)示例
  • clojure 本身也有一些过时的使用实例 - 在补丁中清理这些也会不错。这可能需要单独的补丁来实现,取决于这些是否容易修复。如果测试/中有实际可以保持的案例,可以在那个命名空间中将 * } 设置为 false。
  • 当前的默认值是 true,可能应该改为 false,以匹配反射警告的默认值。
0

评论者:vijaykiran

(链接:~alexmiller) 我可以尝试解决这个问题。

0

评论者:alexmiller

嗨,Vijay,Andrew Rosa 已将其分配给自己,所以请与他就此进行协调,因为他已经开始了这项工作。

0

评论者:bozhidar

只有一个小建议 - 开启过时警告默认值不是更常见吗?有人可能会说它们比反射警告更重要得多,因为你的代码可能会在将来因为未注意到你在使用过时功能而损坏。

0

评论者:alexmiller

(链接:~bozhidar) 我有些犹豫。我不把它作为默认值的主要犹豫是因为人们会突然收到大量新的警告(我想这可能是好事也可能是坏事)。这取决于我们多么希望人们关心过时功能。

0

评论者:pbwolf

默认关闭的过时警告没有解决此工单给出的首要问题:“很容易在不自知的情况下使用已过时的命名空间。”

这与反射警告不同。你可以在任何时间、在任何你感兴趣的时候关注速度。但是最终移除有风险的功能将会是一个突然且不愉快的惊喜;一个警告会有所帮助。

但是——假设我写了300行Clojure代码,使用了来自jar文件的一百万行代码。我自己的代码中出现的弃用问题会不会被海量关于那些jar文件的警告所淹没?更糟糕的是,这种海啸可能会持续数周或数月,直到各个库的作者赶上来。由于jar文件可以通过'lein ancient'和类似方式(更方便地)进行覆盖,我更希望仅对我自己的东西限制弃用警告,也许是通过命名空间前缀,因为如果从编译器的角度来看从jar文件的视角不太方便。

...