يمكن للصفوف أن توسّع صفوفًا أخرى. العبارة 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 مباشرة بعد هذا التمرين.
يقوم عالم طبيعة بفهرسة التنانين التي تعيش حول الكالديرا. تتشارك التنانين سمات مشتركة، فكل تنين له اسم ولون وعمر، لكنها تتخصص بطرق مميزة. ستبني شجرة وراثة صغيرة من أصناف التنانين، وكلمة واحدة تُزيد عمر أي سليل.
عرّف شجرة الوراثة كاملة من أصناف 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"
أعطِ fire-dragon مُنشئًا <fire-dragon>.
"Smaug" "red" 500 1200 <fire-dragon> flame-temp>> . ! => 1200
"Smaug" "red" 500 1200 <fire-dragon> dragon? . ! => t
أعطِ ice-dragon مُنشئًا <ice-dragon>.
"Frosty" "blue" 200 -40 <ice-dragon> chill-temp>> . ! => -40
"Frosty" "blue" 200 -40 <ice-dragon> fire-dragon? . ! => f (siblings)
أعطِ volcano-dragon مُنشئًا <volcano-dragon>.
"Vesuvius" "red" 1000 1500 99 <volcano-dragon> dragon? . ! => t
"Vesuvius" "red" 1000 1500 99 <volcano-dragon> fire-dragon? . ! => t
عرّف age-dragon لتزيد بمقدار واحد قيمة الخانة age لأي تنين (أو سليل). لا تُرجع شيئًا.
"Falkor" "white" 100 <dragon> dup age-dragon age>> . ! => 101
ينبغي أن تعمل الكلمة نفسها على كل سليل، وهذا هو المغزى كله من دالة الوصول المشتركة.
سجّل في Exercism لتتعلّم وتتقن Factor عبر 47 مفهومًا163 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.