أنشئ مُقيِّمًا لمجموعة فرعية بسيطة جدًا من Forth.
Forth لغة برمجة تعتمد على المكدّس. أنشئ مُقيِّمًا أساسيًا جدًا لمجموعة صغيرة من Forth.
على مُقيِّمك أن يدعم الكلمات التالية:
+، -، *، / (العمليات الحسابية على الأعداد الصحيحة)DUP، DROP، SWAP، OVER (التعامل مع المكدّس)كما على مُقيِّمك أن يدعم تعريف كلمات جديدة باستخدام الصيغة المعتادة: : word-name definition ;.
ولتبسيط الأمور، نوع البيانات الوحيد الذي تحتاج إلى دعمه هو الأعداد الصحيحة المُوقّعة بحجم 16 بت على الأقل.
عليك استخدام القواعد التالية للصيغة: العدد هو متتالية من رقم (ASCII) واحد أو أكثر، والكلمة متتالية من حرف أو رقم أو رمز أو علامة ترقيم واحدة أو أكثر، ولا تكون عددًا. (ربما تستخدم Forth قواعد مختلفة قليلًا، لكن هذا قريب بما يكفي.)
الكلمات غير حساسة لحالة الأحرف.
أحيانًا تحتاج في الكود إلى تخصيص الاستثناءات وraise بها. وعندما تفعل ذلك، يجب أن تُضمّن دائمًا رسالة خطأ ذات معنى توضّح مصدر الخطأ، فهذا يجعل الكود أكثر قابلية للقراءة ويساعد كثيرًا في تصحيح الكود.
يمكن إنشاء استثناءات مخصصة عبر أصناف استثناءات جديدة (اطّلع على classes لمزيد من التفاصيل) تكون عادةً أصنافًا فرعية من Exception.
وفي الحالات التي تعرف فيها أن مصدر الخطأ سيكون مشتقًّا من نوع استثناء معيّن، يمكنك أن تختار الوراثة من أحد built in error types الواقعة تحت صنف Exception. وعند رفع الخطأ، يجب أن تُضمّن رسالة ذات معنى على أي حال.
يتطلّب هذا التمرين تحديدًا أن تُنشئ استثناءً مخصصًا لرفعه/«إطلاقه» عندما لا يكون المكدس ممتلئًا بما يكفي. ولن تنجح الاختبارات إلا إذا خصّصت استثناءً مناسبًا، ورفعت ذلك الاستثناء باستخدام raise، وضمّنت رسائل خطأ مناسبة.
# subclassing the Exception to create a StackUnderflowError
class StackUnderflowError(Exception):
"""Exception raised when Stack is not full.
message: explanation of the error.
"""
def __init__(self, message):
self.message = message
# raising a StackUnderflowError
raise StackUnderflowError("Insufficient number of items in stack")
بالإضافة إلى ذلك، يتطلّب هذا التمرين أن ترفع عدة built-in exceptions مع رسائل خطأ.
ولرفع built-in exception مع رسالة، اكتب الرسالة كوسيط لنوع exception:
# an example when division by zero is attempted.
raise ZeroDivisionError("divide by zero")
#an example when the operation is undefined.
raise ValueError("undefined operation")
سجّل في Exercism لتتعلّم وتتقن Python عبر 17 مفهومًا146 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.