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

欢迎!请参阅关于页面获取有关这项工作的一些更多信息。

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

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

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

*由以下人员审查:

17 个答案

+2

评论者:seancorfield

注意到我们在工作中有一个JIRA问题,是为了将我们的一些{{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 以支持文档字符串。添加了执行此操作的新补丁。

0

评论者:stuart.sierra

筛选了 clj-1148-defonce-2.patch 但返回到 'incomplete' 状态。

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

除此之外,补丁很好。

0

评论者:alexmiller

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

0

评论者:stuart.sierra

补丁文件 clj-1148-defonce-3.patch 没有问题,但并没有真正解决 docstring 的问题,因为 {{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}} 绑定或相似的问题没有问题。

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

(补丁 4 错过了一行 def-row,抱歉造成邮件问题。)

0
【回答】 by
_评论者:claj_

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

此版本只是对解析的变量执行 {{(or (nil? v#) (not (.hasRoot v#)))}} 测试。如果是真的,就通过 {{(def ~name ~@args)}} 真正定义,否则不执行任何操作。
...