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

欢迎!请参阅关于页面以获取更多关于该功能的工作原理的信息。

+15
文档
将所有参数从 {{defonce}} 传递给 {{def}},以便它支持文档字符串(或可能的其他未来功能),就像 def。

当重新评估 {{defonce}} 时,文档字符串和其他 Var 元数据将会丢失。

*补丁:* clj-1148-defonce-6.patch

*审核:*

17 个答案

+2

评论者:seancorfield

注意到我们在工作中有一个要将文档字符串添加到我们的一些 {{defonce}} 调用(通过 alter-meta!)的 JIRA 问题,我发现了这个问题,并想知道是什么阻止它向前推进?

Linus 的补丁是否是一个接受的整体解决方案(只是缺少测试)?或者需要有不同的方法吗?这是否因为 CLJ-1446 而被阻塞,人们想先修复它再更新 {{defonce}}?

0

评论者:alexmiller

更改为缺陷,因为它会覆盖元数据。

0

评论者:stu

请添加测试。clojure.test-helper 命名空间提供了有用的临时命名空间支持。

0

评论由:joegallo发表

此新补丁包含对defonce的更改以及测试。

0

评论者:alexmiller

改为审核状态,以便此内容可再次经过筛选。

0

评论由:richhickey发表

我不同意关于stomp元数据 - 提供了不同的元数据。defonce的目的是避免init的重新评估。这是实现文档字符串的 simplest改变吗?无论如何,分成两部分。

0

评论者:alexmiller

将任务的范围减少到只是将defonce参数传递给def,以添加对文档字符串的支持。添加了一个新的补丁来完成这个。

0

评论由:stuart.sierra发表

已筛选clj-1148-defonce-2.patch,但状态返回为'不完整'。

此补丁中的{{:arglists}}元数据(一个符号列表)与其他所有{{:arglists}}(向量列表)的使用不一致。

除此之外,这个补丁很好。

0

评论者:alexmiller

更新补丁,解决了arglist格式中的不一致,并附上了clj-1148-defonce-3.patch。

0

评论由:stuart.sierra发表

修补程序 clj-1148-defonce-3.patch 是好的,但它并没有真正解决文档字符串问题,因为 {{defonce}} 仍然会破坏元数据。例如

`
user=> (defonce foo "foo 的文档字符串" (do (prn 42) 42))
42

'user/foo

user=> (doc foo)

user/foo
foo 的文档字符串
nil
user=> (defonce foo "foo 的文档字符串" (do (prn 42) 42))
nil

user=> (doc foo)

user/foo
nil
`

0

评论由:stuart.sierra发表

有保留地审查。

0

评论由:richhickey发表

Stuart 是对的,第二次 defonce 应该保留文档字符串(因为它再次提供了它,应该是无操作)

0

评论者:alexmiller

从 1.6 中移除

0

评论人:claj

此版本在之前定义的变量中查找 {{resolve}}。如果变量已定义并绑定,重复定义 defonce 将不会影响命名空间。

请确认使用 (resolve '~name) 对 {{ns}}-bindings 或类似内容没有问题。

此补丁还包括来自 {{clj-1148-defonce-3.patch}} 的测试以及 {{:arglists}} 属性。

(补丁 4 错过了 def 行,对于邮箱的噪音表示歉意)。

0
_评论人:claj_

defonce 的另一个更简单的版本。不包括测试用例。

此版本仅对已解析的变量进行 {{(or (nil? v#) (not (.hasRoot v#)))}} 测试。如果这是真的,将通过 {{(def ~name ~@args)}} 真正地进行定义,否则什么都不做。
...