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元数据 - 提供了不同的元数据。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}} 仍然会破坏元数据。例如

`
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}} 寻找之前已定义的 var。如果变量已经定义且绑定,重复的 defonce 不会影响命名空间。

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

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

(补丁 4 错过了一行定义,对此造成的邮箱噪音表示歉意)。

0
_评论人:claj_

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

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