请在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

改变为缺陷,因为 Metadata 被破坏。

0

评论者:stu

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

0

评论者:joegallo

此新补丁包括对defonce和测试的更改。

0

评论者:alexmiller

更改为审核状态,以便再次可筛选。

0

评论者:richhickey

我不同意stomp元数据的问题 - 提供了不同的元数据。defonce的目的在于避免对init的重新评估。这是实现文档字符串的最简单更改吗?无论如何,将其分为两部分。

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 错过了一行定义行,抱歉造成邮件噪音).

0
_评论者:claj_

另一次,更简单的 {{defonce}} 版本。不包含测试案例。

这个版本仅在解引用的变量上做 {{(or (nil? v#) (not (.hasRoot v#)))}} 测试。如果这是真的,则通过 {{(def ~name ~@args)}} 真正定义,否则不进行任何操作。
...