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

欢迎!请参阅 关于 页面以了解如何使用此功能的一些更多信息。

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

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

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

**筛选者:**

17 答案

+2

评论者:seancorfield

注意到我们在工作中有一个 JIRA 问题,要在我们的一些 {{defonce}} 调用中(通过 alter-meta!)添加文档字符串,我发现了这个问题,想知道是什么阻止了其向前推进?

林脇的补丁是否是整体可接受的解决方案(并且只是缺少测试)?或者是否希望有另一种方法?这会被 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 没问题,但它并没有真正解决 docstring 的问题,因为 {{defonce}} 仍然会破坏元数据。例如

`
用户=> (defonce foo "foo 的 docstring" (do (prn 42) 42))
42

'user/foo

用户=> (doc foo)

用户/foo
foo 的 docstring
nil
用户=> (defonce foo "foo 的 docstring" (do (prn 42) 42))
nil

用户=> (doc foo)

用户/foo
nil
`

0

评论者:stuart.sierra

有保留意见地审查。

0

评论者:richhickey

Stuart 对,第二个 defonce 应该保留 doc string (因为它再次提供了,应该是无操作的)

0

评论者:alexmiller

从 1.6 中拉取

0

由:claj 评论

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

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

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

(补丁 4 错过一个 def-row,对不起造成邮件箱的噪音)。

0
_由:claj 评论_

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

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