2024 年 Clojure 状态调查中分享您的观点!

欢迎!有关如何使用本网站的更多信息,请查看关于页面。

0
Clojure
(def a) 销毁 #'a 元数据,请查看此内容


(def ^:mykey a 1)

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

(let [v (def a)]
  [(meta v)            ;; 未找到 :mykey,元数据被销毁
    (identical? v #'a)  ;; true,我们讨论的是相同的变量
   ])

(meta #'a)              ;; 未找到 :mykey


如果不是错误而是“功能”,那么我们至少有两个问题

1- def 特殊形式的文档根本未提到这种行为,这需要明确说明。根据当前的文档,似乎使用无初始化的 def 不会产生任何副作用,而对于 var 元数据来说并非如此。

2- defmulti 使用此形式查找变量并检查它是否已经绑定到 MultiFn,如果是这样,则 defmulti 什么也不做...但实际上会这样做,defmulti 会销毁原始变量的元数据。这就是相关的 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

如果 Stuart 认为这是 {{def}} 认为的 正确 行为,那么 {{defonce}} 不应使用 (def ~name) - 根据 CLJ-1148。我们能否一劳永逸地做出决定,如果行为是按照设计进行的,就拒绝这个问题?或者我们想要补丁来更新文档字符串以使元数据问题清楚?

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