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

欢迎!请在关于页面查看有关该功能的工作方式的一些更多信息。

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

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

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

*审核人员:*

17 个答案

+2

评论者:seancorfield

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

Linus的补丁整体上是可接受的解决方案吗(并且只缺少测试)?或者是否需要不同的方法?这是否由于CLJ-1446而受阻,人们希望在更新{{defonce}}之前修复它?

0

评论者:alexmiller

更改为缺陷,因为它破坏了元数据。

0

评论者:stu

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

0

评论由:joegallo

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

0

评论者:alexmiller

修改为审核通过,这样就可以再次屏幕了。

0

评论由:richhickey

我不同意stomp元数据的问题 - 提供了不同的元数据。defonce的目的在于避免init的重评估。这是完成文档字符串的最简单变化吗?无论如何,分为两个。

0

评论者:alexmiller

将票项范围缩小到仅将defonce参数传递给def,以添加对docstring的支持。添加了执行此操作的新补丁。

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
by

评论由:stuart.sierra

审阅时有保留意见。

0
by

评论由:richhickey

Stuart是正确的,第二个defonce应该保留文档字符串(因为它再次提供了它,应该什么也不做)

0
by

评论者:alexmiller

从1.6中移除

0
by

由:claj 评论

该版本通过resolve查找先前定义的变量。如果变量已被定义并绑定,则重复的defonce根本不会影响命名空间。

请确认使用(resolve '~name)不会对{{ns}}-bindings等造成问题。

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

(补丁4错过了一个def行,对此造成的邮件混乱表示歉意)。

0
by
_评论者:claj_

这是另一个更简单的defonce版本。没有包括测试用例。

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