টাপল অন্য টাপলকে এক্সটেন্ড করতে পারে। 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-এ দেখতে পাবেন।
একজন প্রকৃতিবিদ ক্যালডেরার আশপাশে বাস করা ড্রাগনগুলোর তালিকা তৈরি করছেন। তাদের মধ্যে কিছু বৈশিষ্ট্য সাধারণ, প্রতিটি ড্রাগনেরই একটি নাম, একটি রং আর একটি বয়স থাকে, তবে প্রত্যেকের বিশেষত্ব আলাদা। আপনি ড্রাগন ক্লাসের একটি ছোট ইনহেরিট্যান্স ট্রি বানাবেন, সাথে একটি মাত্র ওয়ার্ড, যা যেকোনো উত্তরসূরির বয়স বাড়িয়ে দেবে।
শুরুতে টিউপল ক্লাসের পুরো ইনহেরিট্যান্স ট্রি ডিফাইন করুন (এদের কনস্ট্রাক্টরগুলো পরের টাস্কগুলোতে আসবে):
name, color, age স্লটসহ dragon।dragon-এর সাবক্লাস fire-dragon, যাতে একটি flame-temp স্লট যোগ হয়।dragon-এর আরেকটি সাবক্লাস ice-dragon, যাতে একটি chill-temp স্লট যোগ হয়।fire-dragon-এর সাবক্লাস volcano-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 স্লট এক বাড়ানোর জন্য age-dragon ডিফাইন করুন। কিছুই রিটার্ন করে না।
"Falkor" "white" 100 <dragon> dup age-dragon age>> . ! => 101
একই ওয়ার্ড প্রতিটি উত্তরসূরির ক্ষেত্রেও কাজ করা উচিত, এটাই তো শেয়ার করা অ্যাকসেসরের আসল উদ্দেশ্য।
Exercism-এ সাইন আপ করুন, Factor ট্র্যাকের 47টি কনসেপ্ট163টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।