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

欢迎!请查看 关于 页面以了解此功能的工作方式。

+3
文档
已关闭

assoc!conj! 的文档字符串都提到 "返回 coll.",可能暗示了瞬态编辑总是就地发生,其中 coll 是第一个参数。但实际上并非如此,应该始终使用返回的集合。

方法:conj(image: assocpop! 的文档字符串中,将 "返回 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

对于亚历克斯来说,这一更新听起来是正确的,仅供参考。

0

评论人:gfredericks

我觉得这样可以。谢谢亚历克斯。我很乐意提交补丁,但我假设这种变更的补丁太多?

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
已回答

comment made by: richhickey

我认为它还可以更清晰,因为我们希望人们知道原始的 coll 可能已经受到影响并返回,并且必须使用返回值进行后续调用。我认为来自 transients 页面的一些语言应该纳入这些文档字符串。

0
已回答

评论人:jafingerhut

这样说是否正确?即传入 pop! conj(image: assoc) 等操作的集合在操作完成后内容未定义,而只有返回值的内容是有定义的?

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

0

评论者:alexmiller

我正在处理这个问题。

0

评论者:alexmiller

未完成,我(仍然)负责这个。

0
参考资料:https://clojure.atlassian.net/browse/CLJ-1385 (由 alex+import 提交)
...