שאלת מבחן בשפות תכנות - האוניברסיטה הפתוחה 2017 - מפרשים
שאלה ב (18 נקודות)
להלן פונקציות value-of של שפת "יוטורג":
הסתירו מה הם השינויים והתוסופות החדשים בהשוואה לשפה בעמוד 79. את התשובה יש לכתוב במחברת הבחינה.
הערות:
להלן פונקציות value-of של שפת "יוטורג":
הסתירו מה הם השינויים והתוסופות החדשים בהשוואה לשפה בעמוד 79. את התשובה יש לכתוב במחברת הבחינה.
הערות:
- המפעקש לעבודה עם סביבונה אותו משתנה כפי שהוצהר עבור שפה "יוטורג".
- המפעקש לעבודה עם החנון (store) הוא אותו משתנה כפי שהוצהר עבור שפה "יוטורג".
- בממשפחת הפנתתרונה, יתתן לכתוב פונקציות צור בממקרה הנדרוש.
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
האוניברסיטה הפתוחהמבחן 2017 סמסטר ב · 2017 · סמסטר ב
★★★★★
מפרשיםevalמודל הסביבהמצבletSchemeתחום לקסיקליסגורים
שימו לב לפעולות החדשות
newref בביטוי let-exp ו-deref בביטוי var-exp. מהי משמעותן וכיצד הן משנות את תפקיד הסביבה ואת מודל החישוב הכולל של המפרש?השינוי המהותי ביותר במפרש המוצג הוא הוספת תמיכה במצב (state) לשפה, כלומר, הפיכת המשתנים לבני-שינוי (mutable). המעבר משפה פונקציונלית טהורה לשפה עם מצב מתבצע באמצעות הכנסת מאגר (store) והפניות (references) למודל החישוב.
נפרט את השינויים והתוספות:
1. שינוי במודל הסביבה והוספת מאגר (Store):
2. שינויים ספציפיים ב-`value-of`:
לסיכום, התוספות העיקריות הן הקונספטים של מאגר (store) והפניות (references), והפעולות הנלוות
נפרט את השינויים והתוספות:
1. שינוי במודל הסביבה והוספת מאגר (Store):
- בשפה פונקציונלית ללא מצב (כמו זו שניתן להניח שהייתה בעמוד 79), הסביבה (environment) ממפה שמות משתנים ישירות לערכים שלהם (
ExpVal). הפעולה(apply-env env var)הייתה מחזירה את הערך הקשור למשתנה. - בשפה החדשה, "יוטורג", הסביבה ממפה שמות משתנים לכתובות או הפניות (
references/locations) במאגר. המאגר, שהוא מבנה נתונים חדש במפרש, ממפה כתובות אלו לערכים. - כתוצאה מכך, מודל החישוב משתנה: כדי למצוא ערך של משתנה, יש קודם למצוא את כתובתו בסביבה, ולאחר מכן לגשת למאגר באמצעות הכתובת כדי למצוא את הערך עצמו.
2. שינויים ספציפיים ב-`value-of`:
- `let-exp`: זהו המקום המרכזי שבו השינוי בא לידי ביטוי.
- הביטוי
exp1מחושב לקבלת ערךv1. - במקום להרחיב את הסביבה עם הזוג
(var, v1), המפרש יוצר הפניה חדשה במאגר באמצעות(newref v1). פעולה זו מקצה תא חדש במאגר, מאתחלת אותו עם הערךv1, ומחזירה את כתובתו של התא. - הסביבה מורחבת כך שהמשתנה
varמקושר לכתובת החדשה שנוצרה, ולא לערךv1עצמו. זה הופך את המשתנה שנוצר על ידיletלמשתנה בר-שינוי. - `var-exp`: חישוב ערכו של משתנה השתנה בהתאם.
- הפעולה
(apply-env env var)מחזירה כעת את הכתובת של המשתנה במאגר, ולא את ערכו. - כדי לקבל את הערך עצמו, יש צורך בפעולה חדשה,
deref, אשר מקבלת כתובת ומחזירה את הערך המאוחסן באותה כתובת במאגר. כלומר,(deref (apply-env env var)). - `proc-exp` ו-`call-exp`: אופן הטיפול בפרוצדורות נשאר דומה, אך יש לו משמעות חדשה בהקשר של מצב. פרוצדורה עדיין נוצרת כסגור (closure) הלוכד את הסביבה בזמן ההגדרה. כעת, סביבה זו היא סביבה של הפניות. כאשר הפרוצדורה נקראת, היא יכולה לגשת (ואם היה קיים אופרטור השמה, גם לשנות) את המשתנים שהיו בסביבה הלקסיקלית שלה דרך ההפניות במאגר.
לסיכום, התוספות העיקריות הן הקונספטים של מאגר (store) והפניות (references), והפעולות הנלוות
newref ו-deref. שינויים אלו הופכים את השפה משפה פונקציונלית טהורה לשפה אימפרטיבית עם מצב ותחום לקסיקלי.