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

欢迎!请参阅关于页面了解如何操作的更多信息。

0
Clojure
(def a) 销毁# 'a元数据,请检查这个


(def ^:mykey a 1)

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

(let [v (def a)]
  [(meta v) ;           URING :mykey present, metadata destroyed]
   (identical? v #'a) ;;;; true, 我们在谈论同一个var
   ])

(meta #'a) ;             ;; :mykey 不存在


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

1- def特殊形式的文档根本没有任何定义此行为,需要澄清。根据目前的文档,似乎没有初始化参数的def None 就会没有任何副作用,这对于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发表

Alex Miller: CLJ-1148似乎是一个特殊情况,这个问题就出现了,但CLJ-1148中的补丁只解决了for {{defonce}}的问题,并没有解决一般for {{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报告)
...