请分享您的想法,参加2024年Clojure现状调查!

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

+15
文档
将{{defonce}}的所有参数传递给{{def}},以便像def一样支持docstring(或可能的其他未来功能)。

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

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

*筛选者:*

17 个答案

+2

评论者:seancorfield

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

林纳斯(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}} 中寻找先前定义的变量。如果变量已经定义并绑定,则重复的 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)}} 定义它,否则不做任何事情。
...