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! 这样的函数——transients 被用作用性能优化,并且在循环中使用 assoc! 或 conj! 往往是这种优化最快的版本。然而,我认为使文档字符串更加明确是有帮助的。

0

由 gfredericks发表的评论:

Alex,我认为你可能误解了问题——OP 是建议引导使用 assoc! 的返回值,而不是完全避免使用 assoc!

文档字符串不仅不够明确,在 OP 指出的具体情况下,实际上是不正确的。conj! 和 assoc! 在数组映射过渡到哈希映射的点并不返回 coll,而它们在其他方面这样做的行为,据我所知,应该是实现细节。

0

评论者:alexmiller

Gary,你是对的,我确实读错了。

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

“返回更新后的集合。”这样的说法能传达正确的意思吗?用“集合”代替“coll”消除了与变量的具体联系,“更新”更强地暗示你应该使用返回值。

0

pyrtsa 发表的评论:

关于 Alex,我觉得这个更新听起来是对的,FWIW。

0

由 gfredericks发表的评论:

是的,我认为这样更好。谢谢 Alex。我很乐意为此提交一个补丁,但是我认为这种改变太重要而不能提交补丁吗?

0

由 jafingerhut 发表的评论:

对于这种在文档字符串中进行改变的情况,补丁正是过去所做过的,如果不是在 clojure.org 网页上。

0

评论者:alexmiller

是的,补丁是期望的。

0

由 gfredericks发表的评论:

很高兴我提了这个问题。

附上补丁,该补丁还更新了pop!的docstring,因为它也存在相同问题,尽管可以说这不那么重要,因为据我所知pop!总是返回相同的集合(但我不认为这是合约的一部分)。

0

由 jafingerhut 发表的评论:

2014年4月6日创建的补丁CLJ-1385-reword-docstrings-on-transient-update-funct.patch不再适用于最新的Clojure master,因为今天早上提交了一些更改。我怀疑由于它们是doc string更改,因此应该很容易更新补丁以确保顺利应用,但也可能有doc string变更已提交给master。

0

由 gfredericks发表的评论:

附上新的补丁。

0

评论者:richhickey

我认为还可以更清晰,因为我们希望人们知道原始的集合可能受到影响并返回,而且返回值必须用于后续调用。我认为transients页面上的某些语言应该包含在这些docstrings中。

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 报告)
...