یک ارزیاب برای زیرمجموعهی بسیار سادهای از Forth پیادهسازی کنید.
Forth یک زبان برنامهنویسی مبتنی بر پشته است. یک ارزیاب بسیار پایهای برای زیرمجموعهی کوچکی از Forth پیادهسازی کنید.
ارزیاب شما باید از واژههای زیر پشتیبانی کند:
+، -، *، / (محاسبات اعداد صحیح)DUP، DROP، SWAP، OVER (دستکاری پشته)ارزیاب شما همچنین باید تعریف واژههای جدید را با نحوهی نگارش معمول پشتیبانی کند: : word-name definition ;.
برای اینکه کارها ساده بماند، تنها نوع دادهای که باید پشتیبانی کنید اعداد صحیح علامتدار با اندازهی حداقل ۱۶ بیت است.
برای نحوهی نگارش باید از این قواعد استفاده کنید: یک عدد دنبالهای از یک یا چند رقم (ASCII) است و یک واژه دنبالهای از یک یا چند حرف، رقم، نماد یا نشانهگذاری است که عدد نباشد. (Forth احتمالاً قواعد کمی متفاوتی دارد، اما این بهقدر کافی نزدیک است.)
واژه به بزرگی و کوچکی حروف حساس نیست.
گاهی لازم است در کد خود استثناها را هم سفارشیسازی کنید و هم raise کنید. وقتی این کار را میکنید، باید همیشه یک پیام خطای معنادار بنویسید تا نشان دهد منبع خطا چیست. این کار کد شما را خواناتر میکند و کمک زیادی به Debug میکند.
میتوان استثناهای سفارشی را از طریق کلاسهای استثنای جدیدی ساخت (برای جزئیات بیشتر 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")