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

欢迎!请查看关于页面,了解更多有关这是如何工作的信息。

+3投票
文档
已关闭

《assoc!》和《conj!》的文档字符串都说“返回coll.”,可能暗示transient编辑总是(总是)原地发生,其中`coll`是第一个参数。然而,情况并非如此,并应始终使用返回的集合。

方法:在`conj(image: `,`assoc)`,`pop!`的文档字符串中将“返回coll.”更改为“返回更新后的集合。”。

补丁:CLJ-1385-reword-docstrings-on-transient-update-funct-2.patch

审阅:Alex Miller

附注关闭: 已发布在Clojure 1.12.0-beta1(已更改'transient'文档字符串)

15个答案

0投票

评论者:alexmiller

在修改transient集合时,必须使用从如assoc!等函数返回的集合。这里的!表示其破坏性。transients页面(https://clojure.org/transients)明确描述了调用模式:“您必须捕获并使用下一个调用中的返回值。”

我不同意我们应该引导程序员远离使用如assoc!之类的函数——transients用作性能优化,在循环中使用assoc!或conj!是其中最快的版本之一。然而,我认为使文档字符串更加明确是有帮助的。

0投票

评论由:gfredericks做出

Alex,我认为你可能误解了这个条目——发起人建议引导使用assoc!的返回值,而不是完全避免使用assoc!

文档字符串不仅不明确,而且在发起人指出的特定情况下实际上是错误的。conj!和{{assoc}}在数组映射转换为哈希映射的点并不会返回{{coll}},它们是否这样做应该是我理解的实际实现细节。

0投票

评论者:alexmiller

@Gary – 你是对的,我确实那样读过了。

{{assoc}}和{{conj}}都明确表示“返回一个新集合”,而assoc!conj!表示“返回coll。”我理解为“返回修改后的集合”,不考虑是否是同一实例,但我也可以按照你的方式理解。

说“返回更新后的集合。”能传达正确的意思吗?使用“集合”而不是“coll”移除了对变量的具体依赖,“更新”更强烈地暗示你应该使用返回值。

0投票

评论由:pyrtsa做出

@Alex,我觉得这样修改听起来是正确的,仅供参考。

0投票

评论由:gfredericks做出

是的,我认为这样更好。谢谢你,Alex。我很乐意为这个修改提交一个补丁,但我觉得这种变化补丁太大,是吗?

0投票

评论由:jafingerhut做出

补丁正是过去进行这类更改的方式,如果它是在文档字符串中,而不是在clojure.org网页上。

0投票

评论者:alexmiller

是的,我们需要补丁。

0投票

评论由:gfredericks做出

很高兴我提出了这个问题。

附带的补丁更新了 pop! 的文档字符串,它也存在同样的问题,虽然可以说它不太重要,因为据我所知,pop! 总是返回相同的集合(但我不认为这是合同的一部分)。

0投票

评论由:jafingerhut做出

于2014年4月6日发布的补丁 CLJ-1385-reword-docstrings-on-transient-update-funct.patch,由于今天早些时候提交的一些更改,不再适用于最新的 Clojure 主分支干净地。我怀疑如果考虑到它们是文档字符串更改,那么更新补丁以干净地应用应该是直接的,但主分支可能也提交了文档字符串更改。

0投票

评论由:gfredericks做出

附上一个新补丁。

0投票

评论人:richhickey

我认为它还可以更加清晰,因为我们需要让人们知道原始的 coll 可能已经受到并返回了,并且必须使用返回值进行后续调用。我认为从 transients 页面的一些语言应该出现在这些文档字符串中。

0投票

评论由:jafingerhut做出

能否说传入 pop! conj(image: assoc) 等操作后,集合的内容是未定义的,而只有返回值有定义的内容?

这类强烈的措辞可能会引起人们的注意。

0投票

评论者:alexmiller

我正在处理这个问题。

0投票

评论者:alexmiller

不完整,我(仍然)拥有这个

0投票
参考:[https://clojure.atlassian.net/browse/CLJ-1385](https://clojure.atlassian.net/browse/CLJ-1385)(由 alex+import 报告)
...