请分享您的想法,参加2024年Clojure调查问卷!

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

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

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

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

*审查者:

17 个答案

+2

评论者:seancorfield

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

林斯的补丁是否是可接受的解决方案(只是缺少测试)?或者需要不同的方法?这是否被CLJ-1446阻塞,人们想在更新{{defonce}}之前修复它?

0

评论者:alexmiller

已将其更改为缺陷,因为stomping元数据。

0

评论者:stu

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

0

评论者:joegallo

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

0

评论者:alexmiller

更改为已验证,这样就可以再次筛选。

0

评论者:richhickey

我关于 stomp 元数据有不同意见 - 提供了不同的元数据。defonce 的目的是避免初始化的重评估。这是不是完成文档字符串的最简单更改?无论如何,分成两部分。

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}} 寻找之前定义的 var。如果变量已经定义并绑定,重复的 defonce 对命名空间没有任何影响。

请确认使用 (resolve '~name) 不会影响 {{ns}}-bindings 或类似的绑定。

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

(patch 4 忽略了一个 def-row,对此造成邮件噪音,抱歉)

0
_评论者:claj_

又是一个更简单的 defonce 版本。不包括测试用例。

这个版本只是对已解析的变量进行了一个 {{(or (nil? v#) (not (.hasRoot v#))}} 测试。如果这是真的,就使用 {{(def ~name ~@args)}} 确实定义它,否则什么也不做。
...