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!。

文档字符串不仅不够明确,而且在OP指出的特定情况下实际上是错误的。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!的docstring,它也有同样的问题,尽管可以说这并不那么重要,因为据我所知pop!总是返回相同的集合(但我不认为这是协议的一部分)。

0

评论者:jafingerhut

由于今天早些时候提交的一些更改,日期为2014年4月6日的补丁CLJ-1385-reword-docstrings-on-transient-update-funct.patch不再干净地适用于最新的Clojure master,因为我怀疑补丁应该很容易更新以干净地应用,因为这些是doc字符串更改,但也可能已经向master提交了doc字符串更改。

0

评论者:gfredericks

附上了一个新的补丁。

0

评论者:richhickey

我认为这仍然可以更清晰,因为我们想让人们知道原始集合可能会受到影响并返回,并且必须使用返回值进行后续调用。我认为transients页面的一些语言应该包含在这些docstrings中。

0

评论者:jafingerhut

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

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

0
by

评论由:alexmiller发表

我正在处理这个问题。

0
by

评论由:alexmiller发表

未完成且我(仍然)负有责任

0
by
参考:[https://clojure.atlassian.net/browse/CLJ-1385](https://clojure.atlassian.net/browse/CLJ-1385) (由 alex+import 提出)
...