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,我们谈论的是同一个 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 Answers

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)(由nahuél报告)
...