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

欢迎!请参阅关于页面以了解更多关于该功能的信息。

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

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

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

*审核:

17个回答

+2

评论者:seancorfield

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

Linus的补丁作为一个整体是可接受的解决方案吗(只是缺少测试)?或者需要一个不同的方法?这是否被CLJ-1446阻塞,人们希望先解决CLJ-1446然后再更新{{defonce}}?

0

评论者:alexmiller

已更改,因为它破坏了元数据。

0

评论者:stu

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

0

由 joegallo 发布的评论:

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

0

评论者:alexmiller

更改状态为“经过审查”,以便再次可筛选。

0

由 richhickey 发布的评论:

关于 stomp 元数据的不同意见 - 提供了不同的元数据。defonce 的目的是避免初始化代码的重评估。这是否是完成文档字符串的最简单更改?无论如何,分割为两个。

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

用户=> (doc foo)

user/foo
foo的文档字符串
nil
user=> (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}}-bindings或类似的内容。

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

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

0
_评论人:claj_

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

这个版本只是对解析后的变量进行{{(or (nil? v#) (not (.hasRoot v#)))}}测试。如果是真的,则通过{{(def ~name ~@args)}}真正定义,否则不执行任何操作。
...