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

欢迎!请查阅关于页面以了解更多关于如何使用此功能的信息。

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

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

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

*审核人员:

17个回答

+2

评论者: seancorfield

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

林斯的补丁是一个可行的解决方案总体上(并且只是缺少测试)吗?或者需要一个不同的方法?这是否被CLJ-1446阻塞了,在这种情况下可能希望在更新{{defonce}}之前修复它?

0

评论者: alexmiller

更改为缺陷,以便摧毁元数据。

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,但状态回到“不完整”。

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

除此之外,该补丁还很不错。

0

评论者: alexmiller

更新补丁以解决arglist格式的差异,并附上clj-1148-defonce-3.patch。

0

由stuart.sierra发表的评论:

补丁文件clj-1148-defonce-3.patch是好的,但它并没有真正解决docstring问题,因为{{defonce}}仍然会破坏元数据。例如

`
user> (defonce foo "foo的docstring" (do (prn 42) 42))
42

'user/foo

user> (doc foo)

user/foo
foo的docstring
nil
user> (defonce foo "foo的docstring" (do (prn 42) 42))
nil

user> (doc foo)

user/foo
nil
`

0

由stuart.sierra发表的评论:

审阅时注明已有保留意见。

0

由richhickey发表的评论:

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

0

评论者: alexmiller

从1.6中移除

0

评论者:claj

此版本使用{{resolve}}查找先前定义的变量。如果变量已经定义和绑定,重复的defonce不会对命名空间产生任何影响。

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

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

(补丁4遗漏了一个def-row,对于打扰邮箱表示歉意)

0
_评论者:claj_

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

此版本只是对解析后的变量进行一个{{(or (nil? v#) (not (.hasRoot v#)))}}测试。如果这是真的,就真的通过{{(def ~name ~@args)}}定义;否则不做任何事情。
...