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

欢迎!有关更多信息,请参阅关于 页面。

+3
文档
已关闭

《assoc!》和《conj!》的文档字符串都表明 "返回 coll。",可能会暗示(总是)在原地执行暂时的编辑,“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 添加

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

我不认为我们应该指导程序员远离使用 `assoc!` 等函数 —— 瞬态集合是用作性能优化,循环中使用 `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

由于今天早些时候的一些更改,补丁CLJ-1385-reword-docstrings-on-transient-update-funct.patch不再适用于最新的Clojure master,因为存在一些文档字符串更改。由于这些是文档字符串更改,我认为更新补丁以正常应用应相当直接,但也许是由于已经将文档字符串更改提交给了master。

0

评论者:gfredericks

附带了新的补丁。

0

评论者:richhickey

我认为这仍然可以更清晰,因为我们希望人们知道原始的集合可能会受到影响并返回,并且返回值必须用于后续调用。我认为从transients页面的一些语言应包含在这些文档字符串中。

0

评论者:jafingerhut

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

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

0

评论由:alexmiller 添加

我在处理这个问题。

0

评论由:alexmiller 添加

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

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