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 meta数据的看法——提供了不同的meta数据。defonce的目的在于避免init重新评估。这是实现文档字符串的简单改动吗?无论如何,分成两个部分。

0

评论者:alexmiller

缩减工单范围,仅将defonce参数传递给def,以添加docstring支持。添加了实现此功能的补丁。

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}} 来查找先前定义的变量。如果变量已经定义并且是有界的话,重复的defonce对命名空间没有任何影响。

请确认使用 (resolve '~name) 对于 {{ns}} 绑定或其他类似的不会造成问题。

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

(补丁4遗漏了一个def行,很抱歉打扰了您的收件箱。)

0
_评论者:claj_

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

这个版本只对解析后的变量进行 {{(or (nil? v#) (not (.hasRoot v#)))}} 测试。如果这个结果是正确的,那么通过 {{(def ~name ~@args)}} 真正地定义它,否则什么也不做。
...