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

欢迎!请访问 关于页面 获取更多关于此功能的信息。

+15
文档
将所有参数从 {{defonce}} 传递到 {{def}},使其支持 docstring(或可能的其他未来特性)如同 def。

当重新评估 {{defonce}} 时,docstring 和其他 Var 元数据将丢失。

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

*审查者:*

17 答案

+2

评论者:seancorfield

注意到我们在工作中有一个添加 docstring 到 handful of {{defonce}} 调用的 JIRA 问题时(通过 alter-meta!),我发现了这个问题,想知道是什么阻止它前进的?

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

0

评论者:alexmiller

变为缺陷,因为破坏了元数据。

0

评论者:stu

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

0

评论者:joegallo

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

0

评论者:alexmiller

更改为已审核,这样又可以进行屏幕测试。

0

评论者:richhickey

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

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}}仍然破坏元数据。例如

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

'user/foo

用户=> (doc foo)

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

用户=> (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}} 属性。

(patch 4 丢失了一行,抱歉邮件噪音)。

0
_评论者:claj_

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

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