Julia: `shift!`と `unshift!`の名前を変更しますか?

作成日 2017年09月27日  ·  59コメント  ·  ソース: JuliaLang/julia

数日前のslackで述べたように、 unshift!は継承される可能性がありますが、それはかなり貧弱な名前のIMHOです。 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!で、私

これまでの4つの関数すべての名前を変更するためのオプションの中で、接尾辞付きのバージョンpushl!popl!pushr! 、およびpopr!が最適です。

push!pop!名前を変更することについてはいくつかの予約があります。 たとえば、優先キューへのプッシュとポップを検討してください。 この場合、「右」と「左」はなく、自然な順序と、最小/最大要素を返すデータ構造のみがあります。 データ構造のような辞書で使用するためのキーを使用するバージョンのpop!もあり、その場合、 popr!も動詞としてはあまり意味がありません。

push!pop!はそのままにして、PriorityQueuesで使用できると思います。 また、配列のpushr!popr!をエイリアスすることもできます。

私はshift!unshift!大好きです、それはjavascriptと同じです。 これを予約してください!

これまでのところ、私は最初の投稿の提案が一番好きです。

push*!pop*!名前を使用して、バリアント間の類似性を強調し、タブ補完でバリアントを簡単に見つけられるようにするのは良いことだと思います。 (私はrl接尾辞の提案が好きです。)

-2からrおよびl用語。 名前は少し醜いです、そしてそれらの4つがあります。 OPが提案するように、シフトの名前を変更し、シフトを解除するだけです。 しかし、シフトとアンシフトは十分に広く使用されているので、そのままにしておくのもよいと思います。 このような信じられないほど一般的な操作に他のも使用し

@JeffBezanson C ++ベクトルはpush_frontを使用するため、これにはいくつかの前例があります。

私は、既存の名前がに背をたどることができると仮定shiftに組み込みsh 、そしておそらくperlのこのアップをピックアップし、発明したunshift (http://www.perlmonks.org /?node_id = 613144)他の言語(php、javascript、...?)が続いたので、前例がたくさんあります。

私は適切な英語の単語が好きです...:)( unshiftは1972年にさかのぼるOEDにあります。)

または、少なくとも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を疑似インデックスとして使用しますか?

別のアイデア:プッシュ/ポップ!(最初、x、...)

ああ何? わかりました、これは本当に創造的なアイデアです:-)

関数firstlastを、それらの内部の実際のコードとは関係なく、純粋に構文として使用するのはかなり奇妙に思えます。 それは一種の素晴らしいことですが、それが奇妙な絡み合いにつながる可能性があるので、この種のことを生態系で奨励すべきかどうかはわかりませんか? たとえば、構文として使用されていた関数の名前を変更したい場合はどうすればよいでしょうか。 確かに、 firstlast可能性はまったくありませんが、それでもです。

このアイデアはクールだと思いますが、 X[mean, :, sum]ように、インデックス作成にリダクション関数を使用するという@mbaumanのアイデアを思い出させます。このような基本的な操作にはあまりにも凝ったものだと思います。 この時点で私が支持しているオプションは次のとおりだと思います。

  1. 物事はそのままにしておきます。「シフト」と「シフト解除」がそうであるように、それらは非常に標準的です。
  2. shift!unshift!名前をpopl!pushl!ます。
  3. 2に加えて、 pop!push!名前をpopr!pushr!ます。
  4. 3に加えて、 popr!pushr! pop!push!エイリアスを作成します。

私は主に1と2の間ですが、3と4にもいくつかの魅力があります。

1)配列の最初と最後に同じ操作(プッシュまたはポップ)を適用するには、少なくとも関連する名前を付ける必要があることは非常に理にかなっていると思います。 push!shift!は直感的でないペアです。 2) shift!という単語>>と混同される可能性があります。 3)多くのJuliaユーザーはとにかくperl / javascriptのバックグラウンドを持っていません。
したがって、私は上記の投稿のオプション2に賛成です。
しかし、名前を変更した場合、 circshift!はどうすればよいでしょうか。

ステファンのオプション2または4は私には良いようです。 popような操作ではないため、 circshift!を変更する必要はないと思います。

提案:

| 古い| 新規| エイリアス|
| ----:| ----:| ----:|
| push! | pushr! | push! |
| pop! | popr! | pop! |
| unshift! | pushl! | |
| shift! | popl! | |

特に、構造体をスタックとしてのみ使用していて、それが左側かどうかを気にしない場合のエイリアスとしてpush!pop!を保持している場合は、それは魅力的だと言わざるを得ません。または、あなたが押したり飛び出したりしている権利。

frontbackするImoは、 leftright短縮するよりも(大幅に)明確です。

特に私たちのベクトルは垂直であるため(したがって、上/下である必要があります)🙂。 他のオプションは、開始/終了または最初/最後です。

左/右は私には問題ないようです。 これは、削減用語( foldlおよびfoldr )、およびベクトルが通常[a,b,c,…]に入力され、 printによって出力される方法と一致しています。

左/右のもう1つの優れた点は、1文字の略語が確立されていることです。

真剣に、私はベクトルのどちらの端が前か後ろかわかりません。 フロントインデックスは1ですか、それともバックですか? はい、ベクトルを垂直に印刷することもありますが、それ以外の場合は左から右に印刷することもあります。 他の多くの機能には、継承された左/右の命名をすでに一貫して使用しています。

追加のための新しいメソッドを持っているだけではどうですか? そして、追加します! ここで、2番目の引数はスカラーですか?

この会話は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!が一番好きで、2つのエイリアスとしてpop!push!があります後者。

ここで、2番目の引数はスカラーですか?

スカラーを一般的に定義することはできません。

「スカラーを一般的に定義することはできません。」

ああ、分かった。 たとえば、次のように指定できます。

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

、しかしあなたは本当にyを「Tに変換できるもの」にしたいのです。 しかし、型システムは(まだ?)どの型のセットを変換できるかを知りません。 バマー。

(拘束力のない、有益な)投票をしましょう:

  • 👍 pushr!popr!pushl!popl!場合、最初の2つのエイリアスとしてpush!pop!
  • 👎そのままにしておく
  • 😕他のオプションについて

その絵文字の選択はやや偏っています;)。

そして:+1:あなたがそれを一番好きならOPの提案について;)

これらの関数の名前を変更することについていくつか考えているので、この会話にノイズが追加されている可能性があることを前もってお詫びします。 これまでのところ、Juliaのpush!pop!shift! 、およびunshift!関数の名前は、Perl、Ruby、およびJavaScriptと同じです(https:// en .wikipedia.org / wiki / Double-ended_queue#Operations)。 個人的には、Perlで最初に学んだので、これらの名前は気にしませんが、シフト/シフト解除は記憶に残るものではないことを完全に認めます。 プッシュ/ポップは悪い補完ペアであると考えるキャンプもあるようです。

別のアイデア: push/pop!(first, x, ...)push/pop!(last, x, ...)

この方向に進む場合は、これらの関数の名前としてenqueue!dequeue!を使用することをお勧めします。

元の名前で私が気に入っているのは、1つの単語を使用していることです。 一言で言えば、より良い組み合わせを作ろうとして、FIFO用にpush!pull! pop! 、FILO用にpush!pop!を思いついた。 これにより、プッシュ/ポップがキューの最後ではなく最初で機能するようになります。

オールド| 新しい
------- | -----
押す! | 置く!
ポップ! | 引く!
シフト! | 押す!
シフト解除! | ポップ!

プッシュ/ポップを最後に残し、プット/プルを最初に移動して壊れにくくすることもできますが、それでは多少混乱が生じると思います。

もう1つの方法は、 append!prepend!を使用して、それぞれpush!shift!です。 しかし、デキューするための合理的な言葉はありません。 beheadcurtailが私が思いついた最高のものでした...

@phaverty Vector{Any}を持つことが可能である限り、それはあいまいになります。

これを再投稿します: https

@omus shift!名前をpush!変更すると、不幸にも混乱するようです。

append!は2つのコレクションで動作しますが、 push! et。 al。 1つの要素で動作するため、その名前のIMOはここでは使用できません。

最後に、私たちは常にユニコードを採用し、次のようなものを使用することができます。

ASCII | Unicode | Unicode名| エイリアス
--- | --- | --- | ---
押す! | ⇤| バーへの左向き矢印|
ポップ! | ↦| バーから右向きの矢印| mapsto
シフト! | ⇥| バーへの右向き矢印|
シフト解除! | ↤| バーから右向きの矢印| mapsfrom

Unicodeのバーをキューと考えてください。 〜残念ながら、これらのユニコード文字には、私が知る限り、REPLに適切なエイリアスがありません〜。

shift!名前をpush!と、不幸にも混乱するようです。

正直なところ、実際にそのアプローチをとったら不幸です。 そのアプローチは間違いなく新参者に親切にしようとしており、ジュリアの既存のユーザーにとって本当に意味があります。

@omus 、たとえば↦は\mapstoです。

わかりました、私は嘘をつきました:もう1つ言いたいことがあります。 より深刻な提案として、このアプローチを採用することができます。 それは素晴らしいプッシュ/ポップを失いますが、進行中の操作に関してはるかに明確です:

オールド| 新しい
-| -
押す! | ラスティン!
ポップ! | 最後に!
シフト! | ファーストイン!
シフト解除! | ファーストアウト!

これらの提案のほとんどを自由に反対票を投じてください。 このトピックについて掘り下げた後、私がたどり着いた唯一の本当の結論は、コンピューター科学者がプッシュ/ポップの用語を採用し、シフト/アンシフトの名前を知らなかったということです。

定数畳み込みができたので、このためのキーワード引数は高速で正しいはずです。 特に、リファクタリングを促進するためにマルチワード関数が特に推奨されていないため、これに2つではなく4つの関数がある理由がわかりません。

このままおもしろいのですが、現状以上のことはできないようです。

このままおもしろいのですが、現状以上のことはできないようです。

OPへのサポートの量はかなりのようですか? おそらく、この問題を解決するのは少し時期尚早ですか? :)

はい、OPの提案には11アップと0ダウンがあります...

私はそれらを、その特定の提案ではなく、名前変更の一般的な概念のサポートとして解釈しました。

このすべての議論の後で、本当に説得力のある代替案が見つからなかったことは私には明らかです。

FWIW pushfront!は今でも私のお気に入りであり、私の意見では名前を変更する価値がありますが、それは私のC ++バイアスかもしれません。

pushfront!popfront!好きです。

さて、私は#25100でpushfront! / popfront!を使用するPRを作成しました。これは、 unshift!名前を変更するためにできる最小限のことだと思います。 本当にunshift!が行っているのは、(a)現状であり、(b)perl / javascript / php /その他の言語でperlから疑わしい選択を継承しているということだけです。

お気軽に撃墜してください;-)

@ 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)

firstまたはlastを渡さずにpush!pop!維持することもできます。これは、デフォルトでpush!(last, ...)pop!(last, ...)

このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

omus picture omus  ·  3コメント

tkoolen picture tkoolen  ·  3コメント

iamed2 picture iamed2  ·  3コメント

i-apellaniz picture i-apellaniz  ·  3コメント

felixrehren picture felixrehren  ·  3コメント