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

欢迎!有关如何操作的更多信息,请查看关于页面。

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

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

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

*审核:

17 个答案

+2

评论者:seancorfield

注意到我们在工作中有一个要为 {{defonce}} 调用添加文档字符串的 JIRA 请求(通过 alter-meta!),我在这个问题上遇到了这个问题,不知道它为什么无法推进?

Linus 的补丁是否是一个可接受的解决方案(并且只是缺少测试)?或者是否需要一个不同的方法?这被 CLJ-1446 阻止了吗,人们希望在该更新 {{defonce}} 之前先解决它?

0

评论者:alexmiller

将问题改为缺陷,因为 metadata 被覆盖。

0

评论者:stu

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

0
by

评论者:joegallo

本新补丁包括对defonce和测试的更改。

0
by

评论者:alexmiller

将其改为经过审查,以便再次可筛选。

0
by

评论者:richhickey

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

0
by

评论者:alexmiller

将工单范围缩小到仅仅是传递defonce参数给def以支持文档字符串。添加了执行此操作的补丁。

0
by

评论者:stuart.sierra

审查了clj-1148-defonce-2.patch,但将其状态返回为“不完整”。

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

除此之外,补丁很好。

0
by

评论者:alexmiller

更新了补丁以解决arglist格式的错误,并附上了clj-1148-defonce-3.patch。

0
by

评论者:stuart.sierra

该修补程序 clj-1148-defonce-3.patch 已通过,但它并没有真正解决文档字符串问题,因为 {{defonce}} 仍然会破坏元数据。例如

`
用户=> (defonce foo "foo 的文档字符串" (do (打印 42) 42))
42

'用户/foo

用户=> (文档 foo)

用户/foo
foo 的文档字符串
nil
用户=> (defonce foo "foo 的文档字符串" (do (打印 42) 42))
nil

用户=> (文档 foo)

用户/foo
nil
`

0

评论者:stuart.sierra

已筛选,但有保留意见。

0

评论者:richhickey

Stuart 是对的,第二个 defonce 应该保留文档字符串(因为再次提供了它,应该不进行操作)

0

评论者:alexmiller

从 1.6 版本中拉出

0

评论者:claj

此版本通过 {{resolve}} 寻找之前定义的变量。如果变量已经定义并绑定,重复的 defonce 不会对命名空间产生任何影响。

请确认使用 (resolve '~name) 与 {{ns}}-bindings 或类似的问题没有问题。

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

(修补 4 遗漏了一行 def 行,抱歉造成邮箱噪音)。

0
_评论者:claj_

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

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