إذا ذهب مستخدمو Java إلى Scala، فسيذهب C# إلى F#، فأين يذهب مستخدمو Ruby للحصول على السكينة الوظيفية؟[مغلق]

StackOverflow https://stackoverflow.com/questions/2254368

سؤال

أعلم أن الكثير من الأشخاص في Java قد بدأوا في النظر إلى Scala لأنه يعمل على JVM، والكثير من الأشخاص في عالم Microsoft ينظرون إلى F#، ولكن ما الذي تمتلكه Ruby كخليفة وظيفي طبيعي؟

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

هل كانت مفيدة؟

المحلول

هناك اثنان جداً تعريفات مختلفة لما تعنيه "البرمجة الوظيفية".يمكنك القيام بالأمر الموجود في روبي، لكن لا يمكنك القيام بالآخر.

وهذان التعريفان هما:

  • البرمجة مع وظائف من الدرجة الأولى و
  • البرمجة مع الوظائف الرياضية

يمكنك إنشاء برنامج بوظائف من الدرجة الأولى في روبي.لديها دعم لوظائف من الدرجة الأولى.في الواقع، لقد حدث ذلك أكثر مما ينبغي الدعم لهم:هنالك Proc.new, proc, lambda, Method, UnboundMethod, كتل, #to_proc و ->() (وربما البعض الآخر الذي أنساه).

كل هذه تتصرف بشكل مختلف قليلا, ، لها بناء جملة مختلف قليلاً، وسلوك مختلف قليلاً وقيود مختلفة قليلاً.على سبيل المثال:الكتلة الوحيدة من بينها التي تتميز بخفة وزنها بما يكفي بحيث يمكنك استخدامها بكثافة، هي الكتل.لكن الكتل لديها بعض القيود الصارمة إلى حد ما:يمكنك تمرير كتلة واحدة فقط إلى الطريقة، والكتل ليست كائنات (والتي في لغة موجهة للكائنات تكون عبارة "كل شيء كائن" عبارة عن جداً تقييد شديد) وعلى الأقل في Ruby 1.8 هناك أيضًا بعض القيود مع المعلمات.

الإشارة إلى طريقة ما هي شيء آخر محرج إلى حد ما.في بايثون أو ECMAScript على سبيل المثال، أستطيع أن أقول فقط baz = foo.bar للإشارة إلى bar طريقة foo هدف.في روبي، foo.bar هي طريقة يتصل, ، إذا أردت الرجوع إلى bar طريقة foo, ، يجب أن أقول baz = foo.method(:bar).وإذا أردت الآن ذلك يتصل هذه الطريقة، لا أستطيع أن أقول فقط baz(), ، يجب أن أقول baz.call أو baz[] أو (في روبي 1.9) baz.().

لذلك، وظائف من الدرجة الأولى في روبي ليست كذلك حقًا الصف الأول.إنهم أفضل بكثير من الدرجة الثانية، وهم كذلك جيد بما فيه الكفاية™، لكنهم ليسوا من الدرجة الأولى تمامًا.

لكن بشكل عام، لا يترك أتباع روبي روبي لوظائف من الدرجة الأولى فقط.يعد دعم روبي جيدًا بما فيه الكفاية بحيث أن أي مزايا قد تكتسبها من دعم أفضل في لغة أخرى عادةً ما يتم استهلاكها من خلال جهد التدريب على اللغة الجديدة أو شيء من هذا القبيل. آخر أنك معتاد على أنه يجب عليك الآن أن تستسلم.مثل، على سبيل المثال RubyGems أو تكامل Unix المحكم أو Ruby on Rails أو بناء الجملة أو ...

ومع ذلك، ثانية تعريف FP هو المكان الذي تسقط فيه روبي على وجهها.إذا كنت ترغب في القيام بالبرمجة باستخدام الدوال الرياضية في روبي، فأنت في عالم من الألم.لا يمكنك استخدام الغالبية المطلقة من مكتبات روبي، لأن معظمها ذات حالة أو فعالة أو تشجع على التحول أو غير نقية.لا يمكنك استخدام المكتبة القياسية لنفس الأسباب.لا يمكنك استخدام المكتبة الأساسية.لا يمكنك استخدام أي من أنواع البيانات الأساسية، لأنها كلها قابلة للتغيير.يمكنك فقط أن تقول "لا يهمني أنها قابلة للتغيير، فأنا ببساطة لن أقوم بتغييرها وسأقوم دائمًا بنسخها"، ولكن المشكلة هي:ولا يزال بإمكان شخص آخر تحويرها.أيضًا، نظرًا لأنها قابلة للتغيير، لا تستطيع روبي تحسين النسخ ولا يتم ضبط أداة تجميع البيانات المهملة لهذا النوع من عبء العمل.

إنه لا يعمل.

هناك أيضًا بعض الميزات التي لا علاقة لها حقًا بالبرمجة الوظيفية ولكن معظم اللغات الوظيفية تميل إلى امتلاكها، والتي تفتقر إليها روبي.مطابقة الأنماط، على سبيل المثال.كما أن تحقيق الكسل لم يكن بهذه السهولة من قبل Enumeratorتم استخدام s بقوة أكبر في Ruby 1.9.ولا تزال هناك بعض الأشياء التي تعمل بشكل صارم Enumerableق أو Arrayق ولكن ليس مع كسول Enumerators، على الرغم من عدم وجود سبب فعليًا للقيام بذلك يتطلب الصرامة.

ولل هذا تعريف FP، فمن المنطقي بالتأكيد أن نترك روبي وراءنا.

اللغتان الرئيسيتان اللتان يتدفق عليهما الروبيون هما إرلانج و كلوجر.كلاهما مطابقان جيدًا نسبيًا لروبي، لأنهما مكتوبان ديناميكيًا، ولديهما ثقافة REPL مماثلة لروبي، و(هذا شيء يتعلق بـ Rails أكثر من كونه شيئًا روبي) كما أنهما جيدان جدًا على الويب.لا يزال لديهم مجتمعات صغيرة جدًا ومرحبة، ولا يزال منشئو اللغة الأصلية نشطين في المجتمع، وهناك تركيز قوي على القيام بأشياء جديدة ومثيرة ومثيرة، وكلها سمات يمتلكها مجتمع روبي أيضًا.

بدأ الاهتمام بـ Erlang عندما عرض أحدهم الفيديو التقديمي الأصلي لعام 1993 "إيرلانج:الفيلم"في RubyConf 2006.بدأ اثنان من مشاريع ريلز رفيعة المستوى باستخدام Erlang، على سبيل المثال مجموعة الطاقة و جيثب.من السهل أيضًا إتقان لغة Erlang بالنسبة إلى Rubyists، لأنها لا تتطلب النقاء بقدر ما هاسكل أو ينظف.ال داخل إن أداء الممثل أمر نقي جدًا، لكن إرسال الرسائل في حد ذاته يعد بالطبع أحد الآثار الجانبية.شيء آخر يجعل من السهل فهم Erlang، وهو أن الممثلين والأشياء هم في الواقع نفس الشيء، عندما تتابع تعريف آلان كاي للبرمجة الشيئية.

لقد كان Clojure إضافة حديثة إلى حزام أدوات Rubyist.أعتقد أن شعبيتها مدفوعة في الغالب بحقيقة أن مجتمع روبي قد استعد أخيرًا لفكرة أن JVM ≠ Java واحتضن جي روبي ثم بدأوا في النظر حول ما آخر أشياء مثيرة للاهتمام كانت موجودة على JVM.ومرة أخرى، تعتبر Clojure أكثر واقعية من اللغات الوظيفية الأخرى مثل Haskell وغيرها من اللغات مثل Lisps مخطط وأبسط بكثير وأكثر حداثة من CommonLisp، لذا فهو مناسب بشكل طبيعي لعشاق Rubyists.

شيء رائع آخر في Clojure هو أنه نظرًا لأن كلاً من Clojure وRuby يعملان على JVM، يمكنك ذلك يجمع هم.

مؤلف "برمجة كلوجر"(ستيوارت هالواي) هو (سابق؟) روبيوي، على سبيل المثال، كما هو فيل هاجيلبرج, ، مؤلف لينينجن أداة بناء لClojure.

ومع ذلك، فإن الياقوتيين ينظرون أيضًا إلى كليهما سكالا (باعتبارها واحدة من لغات FP الأكثر واقعية المكتوبة بشكل ثابت) وهاسكل (باعتبارها واحدة من اللغات الأكثر أناقة).ثم هناك مشاريع مثل سكوبي و الغطرسة وهي الجسور التي تتيح لك دمج روبي مع سكالا وهاسكل، على التوالي.إن قرار تويتر بنقل جزء من البنية التحتية للمراسلة منخفضة المستوى الخاصة به أولاً من MySQL إلى Ruby، ثم من Ruby إلى Scala معروف أيضًا على نطاق واسع.

F# لا يبدو أنه يلعب أي دور على الإطلاق، ربما بسبب الخوف غير العقلاني تجاه كل ما يمتلكه مجتمع روبي من Microsoft.(وهو ما يبدو أنه لا أساس له من الصحة في الغالب، نظرًا لأن فريق F# قد فعل ذلك دائماً الإصدارات المتاحة لـ Mono.)

نصائح أخرى

والناس جافا تستخدم لغة على JVM وتريد واحدة أكثر وظيفية متوافق مع وقت التشغيل، لذلك يذهبون إلى سكالا.

وC # الناس يستخدمون لغة على CLR ويريد أكثر وظيفية واحدة متوافق مع وقت التشغيل، لذلك يذهبون إلى F #.

والناس روبي تستخدم لغة بالفعل ظيفية جدا، وانهم استخدامه في عدد من أوقات التشغيل الأساسية (JRuby، آيرن روبي، MRI، MacRuby، Rubinius، الخ ...). لا أعتقد أن لديها خليفة الوظيفية الطبيعية، أو حتى يحتاج المرء.

ويجب أن يكون أي نسخة من اللثغة غرامة.

وروبي هو النفس هو نوع من لغة البرمجة الوظيفية، لذلك أنا لا أرى أي اللهجات الخاصة FP باستخدام روبي.

في مستوى الضجيج، هاسكل.

وعلى افتراض الناس روبي لا اذهبوا إلى JVM أنفسهم، وأعتقد أن معظم تبني إرلانج، لكونها لغة أخرى كتابتها بشكل حيوي.

وروبي ليست وظيفية ويقول اللثغة، وإنما هو فقط ما يكفي الوظيفية التي يمكنك القيام ببعض البرمجة الوظيفية بطريقة متعة جيدة. (على عكس تحاول أن تفعل البرمجة الوظيفية في شيء من هذا القبيل C #)

وأيضا، فإنه في الواقع يجبر لكم في نماذج وظيفية في بعض بناء الجملة، مثل الاستخدام المكثف للكتل والعائد. (التي وقعت في حب مع بعد تعلم روبي).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top