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

评论者:alexsiller

更改为缺陷以重置元数据。

0

评论者:stu

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

0

评论者:joegallo

这个新补丁包括了defonce和测试更改。

0

评论者:alexsiller

将其更改为已审查,这样就可以再次进行屏幕显示。

0

评论者:richhickey

我不同意stomp元数据 - 提供了不同的元数据。defonce的目的就是为了避免初始化的重新评估。这是实现文档字符串的最简单的方法吗?无论如何,分成两部分。

0

评论者:alexsiller

将门票范围缩减到仅传递defonce参数给def,以支持文档字符串。添加了一个新的补丁来完成这项工作。

0

评论者:stuart.sierra

屏蔽数据夹clj-1148-defonce-2.patch,但返回'未完成'状态。

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

除此之外,补丁是好的。

0

评论者:alexsiller

更新了补丁,以解决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

评论者:alexsiller

从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)}} 确实定义,否则什么也不做。
...