لغة البرمجة القائمة على بطاقة بريدية

صورة
مصدر


ذات مرة أظهر رالف جونسون ، أحد أعضاء عصابة الأربعة ، كيف يمكن أن يكون بناء جملة لغة Smalltalk-80 ملائماً للبطاقات البريدية. الآن ، بعد مرور ما يقرب من 30 عامًا على الإصدار الأول من Smalltalk ، أصبحت لهجة Smalltalk الأسرع نمواً هي Pharo ، التي سنحللها لاحقًا.


إعلان الطريقة


exampleWithNumber: x 

يتم تعريف الأساليب كـ : وتكون أعضاء في الفئة. يتم الإعلان عن طريقة مع معلمات متعددة مثل هذا


 rangeFrom: start to: end 

اسم الطريقة هو rangeFrom:to: ، وأسماء المعلمات هي start end .


إعلان براغما


 <syntaxOn: #postcard> 

يستخدم Pragma لتوضيح الطريقة. يمكن استخدام هذا التعليق التوضيحي بواسطة برنامج التحويل البرمجي أو طرق أخرى كبيانات تعريف.


تعليقات


 "A ""complete"" Pharo syntax" 

تتم الإشارة إلى التعليقات بعلامات اقتباس. يشار إلى علامات اقتباس داخل التعليق بعلامات اقتباس مزدوجة.


إعلان متغير محلي


 | y | 

يتم استخدام المتغيرات المحلية في العمليات الحسابية داخل الطريقة. تعريفات النوع المتغير غير مطلوبة لأن Smalltalk هي لغة مكتوبة بشكل حيوي.


يتم الإعلان عن العديد من المتغيرات في قائمة واحدة.


 | yx totalSum | 

الكائنات والرسائل


 true & false not & (nil isNil) 

كل شيء في Smalltalk هو كائن ، ويمكن للكائنات تلقي الرسائل. يتم تنفيذ أمر التنفيذ (أي إرسال الرسائل) من اليسار إلى اليمين ، ولكن يتم إرسال الرسائل التي لا تحتوي على معلمات بشكل أساسي وفقًا لقواعد الأولوية ، لذلك سيكون ترتيب الحساب هنا


 (true & (false not)) & (nil isNil) 

هناك أربع قواعد أولوية فقط في Smalltalk: يتم إرسال الرسائل الأولى بين قوسين ، ثم أحادية (بدون معلمات إضافية بجانب كائن المستلم نفسه ، على سبيل المثال false not ) ، ثم ثنائي (مع معلمة إضافية واحدة ، على سبيل المثال 1 + 2 ) ، ثم الرسائل مع العديد من المعلمات (مثل 15 between: 1 and: 2 ). يشار إلى أولوية التنفيذ من خلال مخطط بسيط.


الأقواس > أحادي > الرسائل الثنائية > ذات معلمات متعددة


تنطبق هذه القواعد أيضًا على العمليات الرياضية ، وبالتالي تكون نتيجة التعبير


 1 + 15 / 4 " = (1 + 15) / 4 " 

سيكون 4 . بالمناسبة ، nil أيضًا كائن ويمكنه تلقي الرسائل والرد عليها.


التنفيذ الشرطي وكتل الشفرة


 true & false not & (nil isNil) ifFalse: [ self perform: #add: with: x ]. 

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


تُستخدم كتل Smalltalk أيضًا كدالات مجهولة:


 sum := [ :x :y | x+y ]. "  x,y -> x+y " sum value: 10 value: 25. "  ,  - 35" 

إرسال الرسائل إلى نفسك


 self perform: #add: with: x 

يتم استخدام الكلمة الأساسية self كمرجع للكائن الذي يحتوي على الطريقة عند إرسال رسائل إلى الكائن نفسه. نحن هنا نرسل أداء: with: message مع الوسائط #add و x . يشير الرمز # إلى سلسلة حرفية ، تُستخدم هنا كمعرف أسلوب.


احالة متغير


 y := thisContext stack size + super size. 

يشار إلى تعيين متغير من قبل المشغل := . يتم استخدام الكلمة الأساسية الفائقة للإشارة إلى كائن الطبقة الفائقة.


ترث كل كائنات Smalltalk من فئة Object أو الطبقة العليا الخاصة بها ، والتي بدورها ترث من الطبقة الفائقة أو من فئة Object .


مجموعة ثابتة


 byteArray := #[2 2r100 8r20 16rFF]. 

byteArray هو متغير مثيل فئة تم تعريفه عند الإعلان عن الفئة. يتكون صفيف byteArray من أعداد صحيحة مكتوبة في أنظمة أرقام مختلفة في النموذج


 <>r<> 

يتم إصلاح حجم المصفوفات الثابتة وتعيينها في وقت الترجمة. يبدأ فهرسة الصفيف في 1


 byteArray at: 2 " = 2r100 " 

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


 Object subclass: #Counter instanceVariableNames: 'count initialValue' classVariableNames: '' package: 'MyCounter' 

ويتم الإعلان عن طرقها في قسم الأساليب في فئة Counter .


مجموعة ديناميكية


 { -42 . #($a #a #'I''m' 'a' 1.0 1.23e2 3.14s2 1) } 

يتم إنشاء مجموعة حيوية في وقت التشغيل.
يمكن أن تحتوي المصفوفات على بيانات من أنواع مختلفة: العنصر الأول للصفيف هو الرقم -42 ، والعنصر الثاني للصفيف هو مصفوفة تحتوي على عناصر من أنواع مختلفة:


  • $a - الحرف "a"
  • #a #'I''m' - السلاسل الحرفية "a" و "أنا"
  • 'a' - السلسلة "a"
  • 1.0 1.23e2 - أرقام 1.0 1.23e2 العائمة
  • 3.14s2 - الكسر العشري بمقياس 2

دورات


 { -42 . #($a #a #'I''m' 'a' 1.0 1.23e2 3.14s2 1) } do: [ :each | | var | var := Transcript show: each class name; show: each printString ]. 

يتم تنفيذ الحلقات في Smalltalk عن طريق إرسال رسالة إلى صفيف مع كتلة سيتم تنفيذها على كل عنصر من عناصر هذه المجموعة ، والتي تشبه إلى حد بعيد النهج الوظيفي. في كل تكرار ، يتم تمرير عنصر الصفيف كوسيطة إلى الكتلة التي تنفذ بعض العمليات الحسابية عليها. في الكتلة في المثال ، يتم التصريح عن المتغير المحلي var ، والذي يتم تعيينه نتيجة إرسال رسالة show الأخيرة إلى كائن Transcript العمومي.


ميزة مثيرة للاهتمام من Smalltalk هي القدرة على تتالي الرسائل: التعبير


 Transcript show: 'A'; show: 'B'. 

يعرض بشكل متسلسل الخطوط A و B في نافذة وحدة تحكم Transcript . هذا يعادل الكود


 Transcript show: 'A'. Transcript show: 'B'. 

ولكن يتجنب تكرار اسم كائن مستلم رسالة النسخ. نتيجة المتتالية هي استجابة الكائن للرسالة الأخيرة.


إرجاع القيمة من الطريقة


 ^ x < y 

تتم الإشارة إلى العوائد بواسطة ^ . في هذه الحالة ، يتم إرجاع قيمة منطقية - نتيجة المقارنة x < y .

Source: https://habr.com/ru/post/ar446578/


All Articles