Julia: إعادة تسمية "التحول!" و "unshift!"؟

تم إنشاؤها على ٢٧ سبتمبر ٢٠١٧  ·  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 أو شيء مشابه أكثر وضوحًا؟

لست متأكدًا من أن الأمام والخلف أكثر وضوحًا من اليسار واليمين. بالطبع ، بالنسبة للمصطلحات اليسرى / اليمنى ، من المؤسف بعض الشيء أن نطبع المتجهات عموديًا ، لكن المقدمة / الخلفية ليست أفضل في هذا الصدد.

أوه ، ونحن بالفعل نستخدم l و r لليسار واليمين في التخفيضات ، لذلك هناك سابقة - ما لم نرغب في تغييرها أيضًا.

لست متأكدًا من أن الأمام والخلف أكثر وضوحًا من اليسار واليمين.

لست متأكدًا أيضًا. يرتبط front بمؤشرات أقل (مثل Base.front ) و back مع وجود مؤشرات أعلى في ذهني ، لكنني متأكد من أن هذا النوع من الارتباط يختلف.

ربما تبدو الأفكار الأفضل: head - tail و first - last أقل غموضًا بشكل واضح نظرًا لمعانيها الموجودة مسبقًا؟

الأسماء hpush! و hpop! و tpush! و tpop! ليست سيئة. ومع ذلك ، فإننا بالفعل نربط اليسار واليمين بترتيب المصفوفات في foldl و foldr ، إلخ. في الواقع ، لأن هؤلاء لديهم l و r في end ، فإن الأسماء المماثلة هي pushl! و popl! و pushr! و popr! التي أستمتع بها نوعًا ما :)

من بين الخيارات المتاحة حتى الآن لإعادة تسمية جميع الوظائف الأربع ، تبدو الإصدارات اللاحقة pushl! و popl! و pushr! و popr! الأفضل بالنسبة لي.

لدي بعض التحفظات حول إعادة تسمية push! و pop! بالرغم من ذلك. على سبيل المثال ، ضع في اعتبارك الدفع والظهور إلى قائمة انتظار الأولوية. في هذه الحالة لا يوجد "يمين" و "يسار" ، هناك فقط ترتيب طبيعي وبنية بيانات تقوم بإرجاع أصغر / أكبر عنصر. هناك أيضًا إصدار pop! والذي يأخذ مفتاحًا للاستخدام مع القاموس مثل هياكل البيانات ، و popr! لن يكون له معنى كبير في هذه الحالة.

أعتقد أن push! و pop! يمكن أن يظلوا مستخدمين من قبل PriorityQueues. يمكنهم أيضًا الاسم المستعار pushr! و popr! للصفائف.

أحب shift! & unshift! ، إنه نفس الشيء مع جافا سكريبت. الرجاء حجز هذا!

حتى الآن ، أحب اقتراح المشاركة الأولى هو الأفضل.

أعتقد أنه من الجيد استخدام أسماء push*! و pop*! للتأكيد على التشابه بين المتغيرات ، وبالتالي يمكن العثور على المتغيرات بسهولة عن طريق إكمال علامة التبويب. (أحب اقتراح اللاحقة r و l .)

-2 إلى r و l مصطلحات. الأسماء قبيحة بعض الشيء ، وهناك 4 منهم. أفضل إعادة تسمية shift و unshift فقط كما يقترح OP. لكنني أشعر أيضًا أن التغيير وعدم التغيير يتم استخدامهما على نطاق واسع بما يكفي حتى نتمكن من الاحتفاظ بها. سيكون من المؤسف إدخال مصطلحات لا يستخدمها أي

يستخدم ناقل JeffBezanson C ++ push_front ، لذلك هناك سابقة لهذا.

أفترض أن الأسماء الحالية يمكن إرجاعها إلى shift المدمج في sh ، ومن المفترض أن perl اختار هذا واخترع unshift (http://www.perlmonks.org /؟ node_id = 613144) متبوعة باللغات الأخرى (php ، javascript ، ...؟) لذلك هناك الكثير من السوابق.

أنا أفضل الكلمات الإنجليزية المناسبة ... :) ( unshift موجود في OED ويعود تاريخه إلى عام 1972.)

أو على الأقل اذكر shift! & unshift! في مستند pop! & push! :

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

أو على الأقل اذكر shift! & unshift! في مستند pop! & push! :

ذات صلة بـ # 23789

فكرة رائعة ،TotalVerb!

أو دمجها مع splice! / insert! ، مع first و last كمؤشرات زائفة؟

فكرة أخرى: دفع / فرقعة! (أولاً ، س ، ...)

آه ماذا؟ حسنًا ، هذه فكرة إبداعية حقًا :-)

يبدو من الغريب جدًا استخدام الدالتين first و last كصيغة بحتة ، بدلاً من وجود أي علاقة بالشفرة الفعلية بداخلها. إنه نوع رائع ، لكنني لست متأكدًا من أن هذا النوع من الأشياء يجب تشجيعه في النظام البيئي لأنه يمكن أن يؤدي إلى تشابكات غريبة؟ على سبيل المثال ، إذا أردت في أي وقت إعادة تسمية الوظائف التي كانت تُستخدم لبناء الجملة ، فماذا بعد ذلك؟ من المسلم به أنه من غير المحتمل على الإطلاق مقابل first و last ، لكن لا يزال.

يجب أن أقول ، بقدر ما أعتقد أن هذه الفكرة رائعة - فهي تذكرني بفكرةmbauman لاستخدام وظائف الاختزال في الفهرسة ، كما هو الحال في X[mean, :, sum] - أعتقد أنها خيالية جدًا لمثل هذه العملية الأساسية. أعتقد أن الخيارات التي أؤيدها في هذه المرحلة هي:

  1. اترك الأشياء كما هي - إذا كانت غير مناسبة مثل "التحول" و "عدم التغيير" ، فهي قياسية تمامًا.
  2. أعد تسمية shift! و unshift! إلى popl! و pushl! .
  3. بالإضافة إلى 2 ، أعد تسمية pop! و push! إلى popr! و pushr! .
  4. بالإضافة إلى 3 ، أنشئ أسماء مستعارة pop! و push! لـ popr! و pushr! .

أنا بين 1 و 2 إلى حد كبير ولكن هناك بعض الجاذبية لـ 3 و 4 أيضًا.

أعتقد أن 1) من المنطقي أن تطبيق نفس العملية (الدفع أو الفرقعة) على بداية ونهاية المصفوفة يجب أن يكون له على الأقل أسماء مرتبطة ؛ push! و shift! زوج غير بديهي ؛ 2) يمكن الخلط بين الكلمة shift! مع تحويل البت >> ، كما يمكن رؤيته بسهولة من خلال البحث في المستندات عن "shift" ؛ 3) لن يكون لدى العديد من مستخدمي جوليا خلفية بيرل / جافا سكريبت على أي حال.
لذا فأنا أؤيد الخيار 2 في المنشور أعلاه.
ولكن ، إذا قمنا بإعادة تسميتها ، فماذا تفعل حيال circshift! ؟

يبدو أن خيار ستيفان 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 أم أن هذا هو الخلف؟ نعم ، نطبع متجهاتنا في بعض الأحيان عموديًا ، لكننا نطبعها أيضًا من اليسار إلى اليمين في حالات أخرى. نحن بالفعل نستخدم باستمرار التسمية الموروثة اليسرى / اليمنى للعديد من الوظائف الأخرى.

ماذا عن مجرد وجود طرق جديدة للإلحاق! و prepend! أين الوسيطة الثانية عددية؟

تمت إعادة هذه المحادثة إلى 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! كأسماء مستعارة للاثنين أخير.

أين الوسيطة الثانية عددية؟

لا يمكن تحديد العددية بشكل عام.

"لا يمكن تحديد العددية بشكل عام."

آه لقد فهمت. يمكنك تحديد ، على سبيل المثال ،

append! (x :: Vector {T}، y :: T)

، لكنك تريد حقًا أن تكون y "شيئًا يمكن تحويله إلى T". لكن نظام الكتابة لا يعرف (بعد؟) مجموعة الأنواع التي يمكن تحويلها. المشكله.

دعونا نجري تصويتًا (غير ملزم ، إعلامي):

  • 👍 مقابل pushr! ، popr! ، pushl! و popl! مع push! و pop! كأسماء مستعارة لأول اثنين
  • 👎 لإبقاء الأشياء كما هي
  • 😕 لبعض الخيارات الأخرى

اختيار الرموز التعبيرية هذا متحيز إلى حد ما ؛).

و: +1: على اقتراح OPs إذا كنت تحب ذلك الأفضل ؛)

لدي بعض الأفكار حول إعادة تسمية هذه الوظائف ، لذا سأعتذر مقدمًا لاحتمال إضافة بعض الضجيج إلى هذه المحادثة. أسماء جوليا حتى الآن هي وظائف push! و pop! و shift! و unshift! وظائف Perl و Ruby و JavaScript (https: // ar .wikipedia.org / wiki / Double-ended_queue # Operations). أنا شخصياً لا أمانع هذه الأسماء كما تعلمتها في الأصل في بيرل لكنني أعترف تمامًا أن التحول / عدم التحول لا يُنسى. يبدو أيضًا أن هناك معسكرًا يعتقد أن الدفع / البوب ​​هو زوج مكمل سيء .

فكرة أخرى: push/pop!(first, x, ...) و push/pop!(last, x, ...) .

إذا كنا سنذهب في هذا الاتجاه ، أقترح استخدام enqueue! و dequeue! كأسماء لهذه الوظائف.

ما أحبه في الأسماء الأصلية هو أنها تستخدم كلمة واحدة فقط. في محاولة للالتزام بكلمة واحدة مع إجراء بعض عمليات الاقتران اللطيفة ، توصلت إلى push! و pull! لـ FIFO و push! و pop! لـ FILO. هذا من شأنه أن يجعل الضغط / البوب ​​يعمل في بداية قائمة الانتظار بدلاً من النهاية:

قديم | جديد
------- | -----
يدفع! | وضع!
البوب! | يحذب!
تحول! | يدفع!
نزل! | البوب!

يمكننا ترك الدفع / البوب ​​في النهاية ونقل وضع / سحب إلى البداية ليكون أقل كسر ولكن أعتقد أن هذا من شأنه أن يترك الأمور مربكة إلى حد ما.

بديل آخر هو استخدام append! و prepend! للإشارة على التوالي إلى push! و shift! . ليس لدي أي كلمات معقولة لإلغاء ترتيب الصفوف ، ومع ذلك ، فإن behead و curtail كانت أفضل ما يمكنني التوصل إليه ...

phaverty طالما أنه من الممكن أن يكون لديك Vector{Any} ، فسيكون ذلك غامضًا.

سأعيد نشر هذا: https://github.com/JuliaLang/julia/issues/23902#issuecomment -332919287

omus تبدو إعادة تسمية shift! إلى push! محيرة بلا مبرر.

append! على مجموعتين ، بينما push! et. آل. يعمل على عنصر واحد ، لذلك لا يمكن استخدام هذا الاسم هنا في IMO.

أخيرًا ، يمكننا دائمًا استخدام Unicode واستخدام شيء مثل:

ASCII | يونيكود | اسم يونيكود | الاسم المستعار
--- | --- | --- | ---
يدفع! | ⇤ | سهم لليسار لشريط |
البوب! | ↦ | سهم لليمين من شريط | خرائط
تحول! | ⇥ | سهم لليمين لشريط |
نزل! | ↤ | سهم لليمين من شريط | الخرائط من

فكر في الشريط الموجود في unicode باعتباره قائمة الانتظار. ~ لسوء الحظ ، لا تحتوي أحرف unicode هذه على أسماء مستعارة لطيفة في REPL مما يمكنني قوله ~.

يبدو أن إعادة تسمية shift! إلى push! محيرة للغاية.

بصراحة ، لن أكون سعيدًا إذا اتخذنا هذا النهج بالفعل. يحاول هذا النهج بالتأكيد أن يكون لطيفًا مع الوافدين الجدد ويعني حقًا لمستخدمي Julia الحاليين.

omus ، على سبيل المثال ↦ هو \mapsto .

حسنًا ، لقد كذبت: لدي شيء آخر لأقوله. كاقتراح أكثر جدية هو أننا يمكن أن نتبع هذا النهج. يفقد الدفع / البوب ​​اللطيف ولكنه أوضح بكثير فيما يتعلق بالعملية الجارية:

قديم | جديد
- | -
يدفع! | Lastin!
البوب! | صمد!
تحول! | أولا!
نزل! | أولا!

لا تتردد في التصويت على معظم هذه الاقتراحات. بعد إجراء بعض البحث عن هذا الموضوع ، فإن الاستنتاج الحقيقي الوحيد الذي توصلت إليه هو أن علماء الكمبيوتر تبنوا مصطلحات الدفع / البوب ​​ولم يكن لديهم أي فكرة عما يطلقون عليه اسم shift / unshift.

الآن بعد أن أصبح لدينا طي ثابت ، يجب أن تكون حجج الكلمات الرئيسية لهذا سريعة ، أليس كذلك؟ لا أفهم لماذا سيكون لدينا 4 وظائف لهذا بدلاً من 2 ، خاصة وأن الوظائف متعددة الكلمات لا نشجع على تعزيز إعادة البناء.

على الرغم من كونها مسلية ، يبدو أننا لا نستطيع أن نفعل ما هو أفضل من الوضع الراهن هنا.

على الرغم من كونها مسلية ، يبدو أننا لا نستطيع أن نفعل ما هو أفضل من الوضع الراهن هنا.

يبدو مقدار الدعم لـ OP كبير؟ ربما يكون إغلاق هذه القضية سابقًا لأوانه بعض الشيء؟ :)

نعم ، اقتراح OP يحتوي على 11 لأعلى و 0 لأسفل ...

فسرت ذلك على أنه دعم للفكرة العامة لإعادة التسمية ، وليس لهذا الاقتراح المحدد.

من الواضح لي أنه بعد كل هذا النقاش لم نجد بديلاً مقنعًا حقًا.

لا يزال FWIW pushfront! هو المفضل لدي وإعادة تسمية جديرة بالاهتمام في رأيي ، ولكن هذا قد يكون مجرد تحيزي لـ C ++.

أحب pushfront! و popfront! .

حسنًا ، لقد قمت بعمل علاقات عامة في # 25100 لاستخدام pushfront! / popfront! حيث أعتقد أنه الحد الأدنى من الأشياء التي يمكننا القيام بها لإعادة تسمية unshift! . حقًا الشيء الوحيد الذي سيحققه unshift! هو (أ) الوضع الراهن ، و (ب) له سابقة في perl / javascript / php / لغات أخرى ترث خيارات مشكوك فيها من perl

لا تتردد في إسقاطها ؛-)

مشابه لما ذكره @ Sacha0 في # 25100. أعتقد أننا إذا أردنا حقًا إجراء إعادة تسمية ، أقترح استخدام:

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, ...) .

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

i-apellaniz picture i-apellaniz  ·  3تعليقات

dpsanders picture dpsanders  ·  3تعليقات

StefanKarpinski picture StefanKarpinski  ·  3تعليقات

sbromberger picture sbromberger  ·  3تعليقات

felixrehren picture felixrehren  ·  3تعليقات