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

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

0
Clojure
(def a)会破坏#'a的元数据,请查看此内容


(def ^:mykey a 1)

(meta #'a)              ;; 好的,存在:mykey

(let [v (def a)]
  [(meta v)            ;; 没有:mykey,元数据已破坏
   (identical? v #'a)   uygun, 我们讨论的是同一个变量(var)
   ])

(meta #'a)              ;; 没有:mykey


如果这不是一个缺陷而是“特性”,那么我们至少有两个问题

1- def 特殊形式文档根本没有说明这种行为,需要澄清。根据当前文档,似乎执行不提供初始化的 def 不会产生任何副作用,这对于 var 元数据不是真的。

2- defmulti 使用这个形式来查找 var 并检查它是否已绑定到 MultiFn,如果是这种情况,则 defmulti 什么都不做...但实际上它会做,defmulti 将在(假设的非破坏性)检查中破坏原始 var 元数据。这是相关的 defmulti 片段


(let [v# (def ~mm-name)]
  (when-not (and (.hasRoot v#) (instance? clojure.lang.MultiFn (deref v#))))
  ...

6 条答案

0

评论由:alexmiller 发表

我认为这主要是 CLJ-1148 的重复,但我将把它保留下来,因为它更精确地说明了具体问题。

0

评论由:nahuel 发表

亚历克斯·米勒:似乎CLJ-1148是一个特殊情况,在这种情况下这个问题出现了,但CLJ-1148中的补丁仅修复了{{defonce}}的问题,而不是{{def}}的一般问题,也不是{{defmulti}}的问题,并且在{{def}}特殊形式文档中并没有明确说明这种行为。

0

评论者:stu

我敢肯定我们以前也在这里,并且决定{{def}}正在按预期工作。(如果有人能找到线程/票据,请添加链接。)我认为这应该是一个文档增强。

如果{{defmethod}}的行为是一个单独的错误,请为该错误创建一个单独的票据,并显示一个示例问题。

0

评论者:jafingerhut

CLJ-1213可能与之相关,但它没有提到元数据,只有没有提供初始值的(def foo)。

0

评论者:seancorfield

如果斯图尔特是对的,认为这是{{def}}预期行为,那么{{defonce}}就不应该使用(def ~name) -- 按照 CLJ-1148. 我们是否可以做出一次决定,然后如果行为是按设计的话就拒绝这个问题?或者我们希望修复补丁来更新文档字符串以使元数据问题更明确?

0
参考:[https://clojure.atlassian.net/browse/CLJ-1446](https://clojure.atlassian.net/browse/CLJ-1446)(由nahuel报告)
...