المسارات
/
Factor
Factor
/
التمارين
/
أحفاد التنانين
أحفاد التنانين

أحفاد التنانين

تمرين تعلّمي

مقدمة

يمكن للصفوف أن توسّع صفوفًا أخرى. العبارة TUPLE: child < parent slots ; تُعلن عن صنف تكون نسخه أيضًا نسخًا من parent، فتحصل على خانات الأب بالإضافة إلى خاناتها، كما تعمل دوال الوصول الخاصة بالأب عليها أيضًا، تمامًا كما لو كانت قد عُرّفت على الابن.

USING: accessors ;

TUPLE: animal name age ;
TUPLE: dog < animal breed ;

"Rex" 4 "labrador" dog boa .
! => T{ dog { name "Rex" } { age 4 } { breed "labrador" } }

"Rex" 4 "labrador" dog boa name>> .   ! => "Rex"   (inherited accessor)

ترتيب خانات boa

تأخذ الدالة البانية boa الخانات بترتيب التصريح، الأصناف الأصلية أولًا. من أجل dog أعلاه:

dog boa ( name age breed -- dog )

أما الحفيد puppy < dog الذي يضيف weeks فسيكون:

puppy boa ( name age breed weeks -- puppy )

التسلسل الهرمي لدوال التحقق

كل تعريف TUPLE: يولّد دالة تحقق (name?). مع الوراثة تتداخل دوال التحقق، فكل سليل يحقق دوال تحقق أسلافه:

"Rex" 4 "labrador" dog boa
dup dog? .        ! => t
dup animal? .     ! => t

والعكس غير صحيح: أي animal ليس dog يفشل في dog?.

ملاحظة لما سيأتي

الطرق العامة (M:، المشروحة في generics) تُرسل عبر التسلسل الهرمي أيضًا، فالطريقة المعرّفة على animal تُنفَّذ من أجل كل سليل ما لم يكن هناك تجاوز أكثر تخصيصًا له الأولوية. سترى ذلك في boatswains-bilge مباشرة بعد هذا التمرين.

التعليمات

يقوم عالم طبيعة بفهرسة التنانين التي تعيش حول الكالديرا. تتشارك التنانين سمات مشتركة، فكل تنين له اسم ولون وعمر، لكنها تتخصص بطرق مميزة. ستبني شجرة وراثة صغيرة من أصناف التنانين، وكلمة واحدة تُزيد عمر أي سليل.

1. عائلة التنانين

عرّف شجرة الوراثة كاملة من أصناف tuple مقدمًا (تأتي مُنشئاتها في المهام التالية):

  • dragon بخانات name وcolor وage.
  • fire-dragon، صنف فرعي من dragon، يضيف خانة flame-temp.
  • ice-dragon، صنف فرعي آخر من dragon، يضيف خانة chill-temp.
  • volcano-dragon، صنف فرعي من fire-dragon، يضيف خانة lava-volume.

ثم أعطِ dragon مُنشئًا <dragon>.

"Falkor" "white" 100 <dragon> name>> .   ! => "Falkor"

2. نافثو النار

أعطِ fire-dragon مُنشئًا <fire-dragon>.

"Smaug" "red" 500 1200 <fire-dragon> flame-temp>> .   ! => 1200
"Smaug" "red" 500 1200 <fire-dragon> dragon? .        ! => t

3. نافثو الجليد

أعطِ ice-dragon مُنشئًا <ice-dragon>.

"Frosty" "blue" 200 -40 <ice-dragon> chill-temp>> .   ! => -40
"Frosty" "blue" 200 -40 <ice-dragon> fire-dragon? .   ! => f   (siblings)

4. سكان البركان

أعطِ volcano-dragon مُنشئًا <volcano-dragon>.

"Vesuvius" "red" 1000 1500 99 <volcano-dragon> dragon? .       ! => t
"Vesuvius" "red" 1000 1500 99 <volcano-dragon> fire-dragon? .  ! => t

5. زيادة عمر أي تنين

عرّف age-dragon لتزيد بمقدار واحد قيمة الخانة age لأي تنين (أو سليل). لا تُرجع شيئًا.

"Falkor" "white" 100 <dragon> dup age-dragon age>> .   ! => 101

ينبغي أن تعمل الكلمة نفسها على كل سليل، وهذا هو المغزى كله من دالة الوصول المشتركة.

تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Factor Exercism

مستعد لبدء أحفاد التنانين؟

سجّل في Exercism لتتعلّم وتتقن Factor عبر 47 مفهومًا163 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.