یک ارزیاب برای زیرمجموعهی بسیار سادهای از Forth پیادهسازی کنید.
Forth یک زبان برنامهنویسی مبتنی بر پشته است. یک ارزیاب بسیار پایهای برای زیرمجموعهی کوچکی از Forth پیادهسازی کنید.
ارزیاب شما باید از واژههای زیر پشتیبانی کند:
+، -، *، / (محاسبات اعداد صحیح)DUP، DROP، SWAP، OVER (دستکاری پشته)ارزیاب شما همچنین باید تعریف واژههای جدید را با نحوهی نگارش معمول پشتیبانی کند: : word-name definition ;.
برای اینکه کارها ساده بماند، تنها نوع دادهای که باید پشتیبانی کنید اعداد صحیح علامتدار با اندازهی حداقل ۱۶ بیت است.
برای نحوهی نگارش باید از این قواعد استفاده کنید: یک عدد دنبالهای از یک یا چند رقم (ASCII) است و یک واژه دنبالهای از یک یا چند حرف، رقم، نماد یا نشانهگذاری است که عدد نباشد. (Forth احتمالاً قواعد کمی متفاوتی دارد، اما این بهقدر کافی نزدیک است.)
واژه به بزرگی و کوچکی حروف حساس نیست.
در Forth به توابع words میگویند و اینها روی یک پشتهی داده کار میکنند.
هر واژه پارامتر یا پارامترهایش را از پشته میگیرد و نتیجه یا نتیجههایش را روی پشته برمیگرداند.
مستندات Forth همیشه وضعیت پشتهی داده را پیش از اجرای واژه و پس از اجرای واژه به این شکل نشان میدهد: ( p1 p2 ... pN --- r1 r2 ... rN ).
مقدارهای p1 تا pN پارامترهای واژه را روی پشته پیش از فراخوانی نشان میدهند (پشته میتواند دادههای بیشتری بالاتر از اینها داشته باشد که اینجا نمایش داده نشدهاند) و مقدارهای r1 تا rN مقدارهای بازگشتی واژه را روی پشته پس از فراخوانی نشان میدهند.
جداکنندهی --- وضعیت پشته را پیش و پس از اجرای واژه از هم متمایز میکند.
واژههایی که باید پیادهسازی شوند اینگونه تعریف میشوند:
| واژه | وضعیت پشته | توضیح |
|---|---|---|
+ |
( a b --- sum ) |
sum = a + b |
- |
( a b --- diff ) |
diff = a - b |
* |
( a b --- prod ) |
prod = a * b |
/ |
( a b --- quot ) |
quot = a / b |
dup |
( a --- a a ) |
مقدار روی ToS را تکرار میکند |
drop |
( a --- ) |
مقدار روی ToS را حذف میکند |
swap |
( a b --- b a ) |
دو مقدار روی ToS را جابهجا میکند |
over |
( a b c --- a b c b ) |
مقدار دوم را روی ToS کپی میکند |
اگر میخواهید با یک مفسر آنلاین Forth سرگرم شوید یا دربارهی واژههایی که باید پیادهسازی شوند بیشتر بدانید، Easy Forth را امتحان کنید (مخصوصاً بخشهای «Adding Some Numbers»، «Defining Words» و «Stack Manipulation»).