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
by 用户”jira”

评论者:alexmiller

更改为缺陷,因为 metadata 被覆盖了。

0
by 用户”jira”

评论者:stu

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

0

评论者:joegallo

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

0

评论者:alexmiller

更改状态为已审核以便再次可筛选。

0

评论者:richhickey

我不同意关于 stomp 元数据的处理 - 提供了不同的元数据。defonce 的目的是避免重新评估 init。这是完成文档字符串的最简单更改吗?无论如何,分成两步。

0

评论者:alexmiller

将工单范围缩小到仅为 def 向 defonce 传递参数以添加对文档字符串的支持。添加了一个新的补丁来实现这一点。

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应该保留文档字符串(因为它再次提供了它,应该是no-op)

0

评论者:alexmiller

从1.6版本中删除

0

评论者:claj

这个版本通过{{resolve}}查找之前定义的变量。如果变量已经定义且绑定,则重复的defonce不会影响命名空间。

请确认使用(resolve '~name)不会与{{ns}}-bindings或其他类似功能产生问题。

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

(第四个补丁遗漏了一个def行,对不起造成了邮件箱噪音)。

0
_评论者:claj_

defonce的另一个更简单的版本。不包含测试用例。

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