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 以添加对 docstring 的支持。添加了一个新的补丁来执行此操作。

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)}} 真正地定义它,否则什么都不做。
...