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

欢迎!请参阅关于页面获取有关此功能的一些更多信息。

0
Clojure
销毁#'a元数据,请查看




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

(let [v (def a)]
  [(meta v)             ;; NO :mykey present, metadata destroyed
     (identical? v #'a)  ; true, we are talking of the same var
     ])

(meta #'a)               ;; NO :mykey present


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

1- def 特殊形式的文档根本没有说明这种行为,需要澄清。按照当前文档,似乎进行一个没有提供初始化值的 def 将不会产生任何副作用,这并不是 var 元数据的真实情况。

2- defmulti 使用此形式来查找变量并检查它是否已经绑定到一个 MultiFn,如果是这样,则 defmulti 不会做任何事情...但实际上它确实做了,defmulti 将在(理论上非破坏性的)检查中销毁原始 var 元数据。这是涉及的 defmulti 片段


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

6 答案

0
by

由:alexmiller 评论

我认为这大多数是 CLJ-1148 的重复,但我会把它作为一个更精确地表明具体问题的独立问题

0
by

由:nahuel 评论

Alex Miller:CLJ-1148 似乎是这个问题出现的一个特殊情况,但 CLJ-1148 中的补丁只修复了 {{defonce}} 的问题,并没有一般为 {{def}},不为 {{defulti}},也没有在 {{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 报告)
...