正如几天前在 slack 上提到的, unshift!
可能会被继承,但恕我直言,这是一个相当糟糕的名字。 由于 1.0 之前是修复这些东西的时候了,怎么样?
既然取了prepend
,那么unshift!
-> pushfront!
和shift!
-> popfront!
怎么样?
我们可以对这些函数进行批量重命名:
| 旧 | 新 |
|-----|-----|
| push!
| rpush!
|
| pop!
| rpop!
|
| unshift!
| lpush!
|
| shift!
| lpop!
|
或左/右(开始/结束?第一个/最后一个?)关键字,如果可以解决性能问题
左右似乎有点暧昧; 也许@c42f
的正面/背面或类似的东西会更清楚?
我不确定正面和背面是否比左右更清晰。 当然,对于左/右术语来说,我们垂直打印矢量有点不幸,但在这方面前/后并没有更好。
哦,我们已经将l
和r
用于左和右的减少,所以有先例——除非我们也想改变它们。
我不确定正面和背面是否比左右更清晰。
我也不确定。 front
与较低的指数(如Base.front
)相关联,而back
在我的脑海中与较高的指数相关联,但我确信这种关联会有所不同。
也许更好的想法: head
- tail
和first
- last
鉴于它们先前存在的含义似乎明显不那么模棱两可?
名称hpush!
、 hpop!
、 tpush!
和tpop!
都不错。 然而,我们已经将左右与foldl
和foldr
的数组排序相关联,等等。实际上,因为那些有l
和r
在最后,类似的名字是pushl!
、 popl!
、 pushr!
和popr!
,我很喜欢:)
在迄今为止重命名所有四个函数的选项中,后缀版本pushl!
、 popl!
、 pushr!
和popr!
对我来说看起来最好。
不过,我对重命名push!
和pop!
有一些保留。 例如,考虑推送和弹出优先级队列。 在这种情况下,没有“右”和“左”,只有自然排序和返回最小/最大元素的数据结构。 还有pop!
的版本,它需要一个键用于像数据结构这样的字典,在这种情况下popr!
作为动词也没有多大意义。
我认为push!
和pop!
可以保留并被 PriorityQueues 使用。 他们也可以为数组取别名pushr!
和popr!
。
我喜欢shift!
和unshift!
,这与 javascript 相同。 请保留这个!
到目前为止,我最喜欢第一篇文章的建议。
我认为最好使用push*!
和pop*!
名称来强调变体之间的相似性,这样可以通过 Tab 补全轻松找到这些变体。 (我喜欢r
和l
后缀建议。)
-2 到r
和l
术语。 名字有点丑,一共有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!
合并,以first
和last
作为伪索引?
另一个想法:push/pop!(first, x, ...)
啊什么? 好的,这是一个非常有创意的想法:-)
将函数first
和last
纯粹用作语法,而不是与其中的实际代码有任何关系,这似乎很奇怪。 这很好,但我不确定生态系统是否应该鼓励这种事情,因为它会导致奇怪的纠缠? 例如,如果您想重命名用作语法的函数,那该怎么办? 不可否认, first
和last
根本不可能,但仍然如此。
我不得不说,尽管我认为这个想法很酷——它让我想起了@mbauman在索引中使用归约函数的想法,就像在X[mean, :, sum]
——我认为对于这样一个基本操作来说太花哨了。 我想我现在赞成的选项是:
shift!
和unshift!
重命名shift!
popl!
和pushl!
。pop!
和push!
重命名pop!
popr!
和pushr!
。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 使用front
和back
比缩写left
和right
(明显)更清晰。
特别是因为我们的向量是垂直的(所以它应该是顶部/底部)🙂。 其他选项可能是开始/结束或第一个/最后一个。
左/右对我来说似乎很好; 它与我们的归约术语( foldl
和foldr
)以及向量通常如何输入[a,b,c,…]
并由print
。
关于左/右的另一个好处是它有一个完善的单字符缩写。
说真的,我不知道向量的哪一端是正面或背面。 前面的索引是 1 还是后面的? 是的,我们有时会垂直打印我们的向量,但在其他情况下我们也会从左到右打印它们。 我们已经为许多其他功能一直使用继承的左/右命名。
拥有新的追加方法怎么样! 并预先! 其中第二个参数是标量?
这个对话又循环回到了 https://github.com/JuliaLang/julia/issues/23902#issuecomment-332615200,又再次提示 https://github.com/JuliaLang/julia/issues/23902#issuecomment-332668546 ,即head
/ tail
或first
/ 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!
。 然而,我没有任何合理的出队词,而behead
和curtail
是我能想到的最好的...
@phaverty只要可能有Vector{Any}
,那将是模棱两可的。
我会重新发布这个: https :
@omus将shift!
重命名push!
似乎毫无意义地令人困惑。
append!
操作两个集合,而push!
等。 阿尔。 对一个元素进行操作,因此 IMO 无法在此处使用该名称。
最后,我们总是可以拥抱 unicode 并使用以下内容:
ASCII | 统一码 | Unicode 名称 | 别名
---|---|---|---
推! | ⇤ | 向左箭头条|
流行音乐! | ↦ | 从酒吧向右箭头| 地图
转移! | ⇥ | 向右箭头到栏|
不动! | ↤ | 从酒吧向右箭头| 地图来源
将 unicode 中的栏视为队列。 ~不幸的是,据我所知,这些 unicode 字符在 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!
而不传入first
或last
,这将默认为push!(last, ...)
和pop!(last, ...)
。
最有用的评论
另一个想法:
push/pop!(first, x, ...)
和push/pop!(last, x, ...)
。从理论上讲,这种语法可以很好地推广到诸如
pop!(min, x)
。