Julia: 重命名 `shift!` 和 `unshift!` ?

创建于 2017-09-27  ·  59评论  ·  资料来源: JuliaLang/julia

正如几天前在 slack 上提到的, unshift!可能会被继承,但恕我直言,这是一个相当糟糕的名字。 由于 1.0 之前是修复这些东西的时候了,怎么样?

既然取了prepend ,那么unshift! -> pushfront!shift! -> popfront!怎么样?

最有用的评论

另一个想法: push/pop!(first, x, ...)push/pop!(last, x, ...)

从理论上讲,这种语法可以很好地推广到诸如pop!(min, x)

所有59条评论

我们可以对这些函数进行批量重命名:

| 旧 | 新 |
|-----|-----|
| push! | rpush! |
| pop! | rpop! |
| unshift! | lpush! |
| shift! | lpop! |

或左/右(开始/结束?第一个/最后一个?)关键字,如果可以解决性能问题

左右似乎有点暧昧; 也许@c42f的正面/背面或类似的东西会更清楚?

我不确定正面和背面是否比左右更清晰。 当然,对于左/右术语来说,我们垂直打印矢量有点不幸,但在这方面前/后并没有更好。

哦,我们已经将lr用于左和右的减少,所以有先例——除非我们也想改变它们。

我不确定正面和背面是否比左右更清晰。

我也不确定。 front与较低的指数(如Base.front )相关联,而back在我的脑海中与较高的指数相关联,但我确信这种关联会有所不同。

也许更好的想法: head - tailfirst - last鉴于它们先前存在的含义似乎明显不那么模棱两可?

名称hpush!hpop!tpush!tpop!都不错。 然而,我们已经将左右与foldlfoldr的数组排序相关联,等等。实际上,因为那些有lr在最后,类似的名字是pushl!popl!pushr!popr! ,我很喜欢:)

在迄今为止重命名所有四个函数的选项中,后缀版本pushl!popl!pushr!popr!对我来说看起来最好。

不过,我对重命名push!pop!有一些保留。 例如,考虑推送和弹出优先级队列。 在这种情况下,没有“右”和“左”,只有自然排序和返回最小/最大元素的数据结构。 还有pop!的版本,它需要一个键用于像数据结构这样的字典,在这种情况下popr!作为动词也没有多大意义。

我认为push!pop!可以保留并被 PriorityQueues 使用。 他们也可以为数组取别名pushr!popr!

我喜欢shift!unshift! ,这与 javascript 相同。 请保留这个!

到目前为止,我最喜欢第一篇文章的建议。

我认为最好使用push*!pop*!名称来强调变体之间的相似性,这样可以通过 Tab 补全轻松找到这些变体。 (我喜欢rl后缀建议。)

-2 到rl术语。 名字有点丑,一共有4个。 我宁愿只像 OP 建议的那样重命名 shift 和 unshift 。 但我也觉得 shift 和 unshift 的使用非常广泛,我们不妨保留它们。 不幸的是,引入其他人没有使用的术语来进行这种非常常见的操作。

@JeffBezanson C++ 向量使用push_front ,因此有一些先例。

我认为现有的名称可以追溯到shift内置的sh ,大概是 perl 发现并发明了unshift (http://www.perlmonks.org /?node_id=613144) 其他语言(php、javascript、...?)紧随其后,因此有很多先例。

我更喜欢正确的英语单词... :) ( unshift在 OED 中可以追溯到 1972 年。)

或者至少在pop!push!的文档中提到shift!unshift!

help?> pop!
search: pop! popdisplay apropos deepcopy precompile __precompile__ peakflops promote_type
also see: `shift!` `unshift!` `push!`

  pop!(collection, key[, default])

  Delete and return the mapping for key if it exists in collection, otherwise return default, or
  throw an error if default is not specified. 

另一个想法: push/pop!(first, x, ...)push/pop!(last, x, ...)

从理论上讲,这种语法可以很好地推广到诸如pop!(min, x)

或者至少在pop!push!的文档中提到shift!unshift!

有关 #23789

好主意,@TotalVerb!

或者与splice! / insert!合并,以firstlast作为伪索引?

另一个想法:push/pop!(first, x, ...)

啊什么? 好的,这是一个非常有创意的想法:-)

将函数firstlast纯粹用作语法,而不是与其中的实际代码有任何关系,这似乎很奇怪。 这很好,但我不确定生态系统是否应该鼓励这种事情,因为它会导致奇怪的纠缠? 例如,如果您想重命名用作语法的函数,那该怎么办? 不可否认, firstlast根本不可能,但仍然如此。

我不得不说,尽管我认为这个想法很酷——它让我想起了@mbauman在索引中使用归约函数的想法,就像在X[mean, :, sum] ——我认为对于这样一个基本操作来说太花哨了。 我想我现在赞成的选项是:

  1. 保持原样——就像“shift”和“unshift”一样不确定,它们是非常标准的。
  2. shift!unshift!重命名shift! popl!pushl!
  3. 除了 2 之外,将pop!push!重命名pop! popr!pushr!
  4. 除了 3 之外,为popr!pushr!制作pop!push!别名。

我主要在 1 和 2 之间,但也有一些对 3 和 4 的吸引力。

我认为 1) 对数组的开头和结尾应用相同的操作(推送或弹出)至少应该具有相关名称是很有意义的; push!shift!是一对不直观的对; 2) 单词shift!可能与位移位>>混淆,这可以通过在文档中搜索“shift”轻松看出; 3) 无论如何,许多 Julia 用户不会有 perl/javascript 背景。
因此,我赞成上述帖子中的选项 2。
但是,如果我们重命名它们,如何处理circshift!

Stefan 的选项 2 或 4 对我来说似乎不错。 我不认为circshift!需要改变,因为它不是pop类的操作

提议:

| 旧 | 新 | 别名 |
|----:|----:|----:|
| push! | pushr! | push! |
| pop! | popr! | pop! |
| unshift! | pushl! | |
| shift! | popl! | |

我不得不说这很诱人,特别是如果我们将push!pop!作为别名用于您仅将结构用作堆栈并且并不真正关心它是否在左边的情况下或者你正在推动和弹出。

Imo 使用frontback比缩写leftright (明显)更清晰。

特别是因为我们的向量是垂直的(所以它应该是顶部/底部)🙂。 其他选项可能是开始/结束或第一个/最后一个。

左/右对我来说似乎很好; 它与我们的归约术语( foldlfoldr )以及向量通常如何输入[a,b,c,…]并由print

关于左/右的另一个好处是它有一个完善的单字符缩写。

说真的,我不知道向量的哪一端是正面或背面。 前面的索引是 1 还是后面的? 是的,我们有时会垂直打印我们的向量,但在其他情况下我们也会从左到右打印它们。 我们已经为许多其他功能一直使用继承的左/右命名。

拥有新的追加方法怎么样! 并预先! 其中第二个参数是标量?

这个对话又循环回到了 https://github.com/JuliaLang/julia/issues/23902#issuecomment-332615200,又再次提示 https://github.com/JuliaLang/julia/issues/23902#issuecomment-332668546 ,即head / tailfirst / last术语? :)

糟糕,抱歉拖延了讨论。 我的观点是,与其发明新词,不如重复使用现有词。

糟糕,抱歉拖延了讨论。 我的观点是,与其发明新词,不如重复使用现有词。

对不起@phaverty! 我们同时发布。 我的回复是为了遵循@StefanKarpinski的,而不是对您的评论发表评论:)。 最好的事物!

我最喜欢popfirst!pushfirst!poplast!pushlast!pop!push!作为两者的别名后者。

其中第二个参数是标量?

不可能一般性地定义标量。

“不可能笼统地定义标量。”

啊,我明白了。 你可以指定,说,

追加!( x::Vector{T}, y::T )

,但你真的希望 y 是“可以转换为 T 的东西”。 但是,类型系统(还?)不知道可以转换哪些类型集。 无赖。

让我们进行(非约束性的,信息丰富的)投票:

  • 👍 用于pushr!popr!pushl!popl!其中push!pop!作为前两个的别名
  • 👎 保持事物原样
  • 😕还有其他选择

表情符号的选择有点偏激;)。

并且 :+1: 如果你最喜欢 OPs 的建议;)

我对重命名这些函数有一些想法,所以我会预先道歉,因为可能会在此对话中添加一些噪音。 到目前为止,Julia 的push!pop!shift!unshift!函数的名称与 Perl、Ruby 和 JavaScript 相同(https://en .wikipedia.org/wiki/Double-ended_queue#Operations)。 就我个人而言,我不介意这些名字,因为我最初是在 Perl 中学到的,但我完全承认 shift/unshift 并不令人难忘。 似乎还有一个阵营认为push/pop 是一个糟糕的互补对

另一个想法: push/pop!(first, x, ...)push/pop!(last, x, ...)

如果我们朝这个方向发展,我建议我们使用enqueue!dequeue!作为这些函数的名称。

我喜欢原始名称的地方在于它们只使用一个词。 试图保持一个词但做一些更好的配对我想出了push!pull!用于 FIFO 和push!pop!用于 FILO。 这将使 push/pop 在队列的开头而不是结尾工作:

旧 | 新的
-------|-----
推! | 放!
流行音乐! | 拉!
转移! | 推!
不动! | 流行音乐!

我们可以将 push/pop 放在最后,将 put/pull 移到开头以减少破坏,但我认为这会让事情变得有些混乱。

另一种选择是使用append!prepend!分别引用push!shift! 。 然而,我没有任何合理的出队词,而beheadcurtail是我能想到的最好的...

@phaverty只要可能有Vector{Any} ,那将是模棱两可的。

我会重新发布这个: https :

@omusshift!重命名push!似乎毫无意义地令人困惑。

append!操作两个集合,而push!等。 阿尔。 对一个元素进行操作,因此 IMO 无法在此处使用该名称。

最后,我们总是可以拥抱 unicode 并使用以下内容:

ASCII | 统一码 | Unicode 名称 | 别名
---|---|---|---
推! | ⇤ | 向左箭头条|
流行音乐! | ↦ | 从酒吧向右箭头| 地图
转移! | ⇥ | 向右箭头到栏|
不动! | ↤ | 从酒吧向右箭头| 地图来源

将 unicode 中的栏视为队列。 ~不幸的是,据我所知,这些 un​​icode 字符在 REPL 中没有很好的别名~。

shift!重命名push!似乎毫无意义地令人困惑。

老实说,如果我们真的采取这种方法,我会很不高兴。 这种方法肯定是试图对新人友好,对 Julia 的现有用户真的很重要。

@omus ,例如 ↦ 是\mapsto

好吧,我撒了谎:我还有一件事要说。 一个更严肃的建议是我们可以采用这种方法。 它失去了漂亮的推送/弹出,但对于正在进行的操作要清晰得多:

旧 | 新的
-- | ——
推! | 持久!
流行音乐! | 撑得住!
转移! | 先入!
不动! | 先发制人!

随意对这些建议中的大部分投反对票。 在对这个主题进行了一些挖掘之后,我得出的唯一正确结论是,计算机科学家接受了 push/pop 术语,并且不知道应该给 shift/unshift 取什么名字。

现在我们有了常量折叠,这个的关键字参数应该很快,对吗? 我不明白为什么我们会有 4 个函数而不是 2 个,特别是因为特别不鼓励使用多词函数来促进重构。

有趣的是,我们似乎不能比这里的现状做得更好。

有趣的是,我们似乎不能比这里的现状做得更好。

对 OP 的支持量似乎很大? 也许关闭这个问题有点为时过早? :)

是的,OP 的建议有 11 个向上和 0 个向下......

我将这些解释为支持重命名的一般概念,而不是支持那个具体的建议。

我很清楚,经过所有这些讨论,我们没有找到真正令人信服的替代方案。

FWIW pushfront!仍然是我最喜欢的,在我看来值得重命名,但这可能只是我的 C++ 偏见。

我喜欢pushfront!popfront!

好吧,我在 #25100 中做了一个 PR 来使用pushfront! / popfront!因为我认为重命名unshift!是我们可以做的最少的事情。 真的, unshift!唯一要做的就是(a)它是现状,并且(b)它在 perl/javascript/php/其他语言中有先例,从 perl 继承了可疑的选择

随意击落它;-)

类似于#25100 中@Sacha0提到的内容。 我想如果我们真的想重命名,我建议使用:

enqueue!(::typeof(first), a, item) = unshift!(a, item)
enqueue!(::typeof(last), a, item) = push!(a, item)
dequeue!(::typeof(first), a) = shift!(a)
dequeue!(::typeof(last), a) = pop!(a)
julia> enqueue!(::typeof(first), a, item) = unshift!(a, item);

julia> enqueue!(::typeof(last), a, item) = push!(a, item);

julia> dequeue!(::typeof(first), a) = shift!(a);

julia> dequeue!(::typeof(last), a) = pop!(a);

julia> foo = [1, 2, 3]
3-element Array{Int64,1}:
 1
 2
 3

julia> enqueue!(first, foo, 0)
4-element Array{Int64,1}:
 0
 1
 2
 3

julia> dequeue!(first, foo)
0

julia> enqueue!(last, foo, 5)
4-element Array{Int64,1}:
 1
 2
 3
 5

julia> dequeue!(last, foo)
5

或者:

push!(::typeof(first), a, item) = unshift!(a, item)
push!(::typeof(last), a, item) = push!(a, item)
pop!(::typeof(first), a) = shift!(a)
pop!(::typeof(last), a) = pop!(a)

我们也可以保留push!pop!而不传入firstlast ,这将默认为push!(last, ...)pop!(last, ...)

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

StefanKarpinski picture StefanKarpinski  ·  3评论

sbromberger picture sbromberger  ·  3评论

dpsanders picture dpsanders  ·  3评论

ararslan picture ararslan  ·  3评论

musm picture musm  ·  3评论