2024 年 Clojure 调查问卷! 中分享您的想法。

欢迎!有关如何使用此页面,请参阅 关于 页面,获取更多信息。

0 投票
Clojure
(def a) 会销毁 `'a` 的元数据,请看看这个


(def ^:mykey a 1)

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

(let [v (def a)]
   [(meta v)              ;; NO :mykey 存在,元数据已销毁
    (identical? v #'a)  ;; true,我们在谈论的是同一个变量
   ])

(meta #'a)              ;; NO :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 撰写

Alex Miller:CLJ-1148 是一个特殊情况,这个问题会在其中出现,但 CLJ-1148 中的补丁仅修复了 {{defonce}} 的问题,并未针对 {{def}}、{{defmulti}} 和未在 {{def}} 特殊形式文档中说明这种行为。

0 投票
答对了 jira

评论由:stu

我相当确信我们以前在这里讨论过,并决定的功能按预期工作。(如果有人能找到这个帖子/工单,请添加链接。)我认为这应该是一个文档增强。

如果的行为是另一个独立的错误,请为它创建一个单独的工单,并提供一个示例问题。

0 投票
答对了 jira

评论由:jafingerhut

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

0 投票
答对了 jira

评论由:seancorfield

如果Stuart认为这是的正常行为,那么不应该使用(code)(def~name)--根据CLJ-1148。我们能否做出最终决定,然后如果行为是按设计进行的,就拒绝这个问题?或者我们想修复文档字符串以使元数据问题更加明确?

0 投票
答对了 jira
参考:https://clojure.atlassian.net/browse/CLJ-1446 (报告者:nahuel)
...