387. Eval

בהמשך לפעם הקודמת,

ראינו בפעם שעברה שניתן לכתוב מתודה שמקבלת Expression המייצג פונקציה מתמטית, ומחזירה את הנגזרת שלו כExpression אחר.

כעת יש שאלה מתבקשת: כיצד ניתן לכתוב אפליקציה המקבלת את הExpression הנ”ל כקלט מהמשתמש וכותבת לו את התוצאה?

היינו אולי מצפים שתהיה פונקציה Expression.Parse שמקבלת מחרוזת ויוצרת ממנה Expression, אך אין דבר כזה בFramework.

מה שכן, אם המשתמש שלנו היה יכול לכתוב קוד, אז היה לו יחסית פשוט לכתוב משתנה מהסוג Expression> ולאתחלו בLambda שמייצגת את הפונקציה שלו. (ראו גם פעם קודמת)

כלומר, אם הייתה לנו האופציה לקבל מחרוזת, להריץ ממנה קוד ולקבל ממנה אובייקט, היינו יכולים בין השאר לקבל מהמשתמש מחרוזת המייצגת פונקציה, להריץ ממנה השמה למשתנה, לקבל בקוד את הExpression המייצג את המשתנה ולבסוף להעביר אותו כפרמטר לפונקציית הגזירה שלנו.

לפעולה כזאת קוראים Evaluation ויצא לכם בוודאי להיתקל בה:

למשל, כאשר אנחנו כותבים בWatch של Visual Studio איזשהו ביטוי, מתבצע Evaluation שלו כדי לחשב את הביטוי ולהציג לנו ערך שמייצג אותו.

לדבר הזה שימושים רבים, ביניהם:

  • כתיבת קונפיגורציה מורכבת (קונפיגורציה כזאת עשויה להכיל קטעי קוד שירוצו בתכנית שלנו – למשל, קונפיגורציה שמכילה נוסחה בה נשתמש על מנת לחשב משהו בתהליך שלנו)
    • בין השאר הכנסת שאילתות LINQ לקונפיגורציה שלנו – כך נוכל לשנות את השאילתות מול הDatabase בקונפיגורציה ובנוסף להשתמש בLINQ
  • כתיבת Interactive Shell – זוהי אפליקציה המאפשרת לנו להריץ שורות קוד בזמן ריצה, בין השאר היא מאפשרת לנו לעשות בדיקות On the fly, מבלי לקמפל ולהריץ כל פעם מחדש. כנראה מה שרובנו עושים כדי לעשות בדיקות כאלה היום זה להריץ את התוכנה בDebug ולעשות את הניסויים הנ”ל בWatch
  • יצירת תוכנות בעלות התנהגות דינאמית – תוכנות כאלה יכולות לשנות לעצמן את ההתנהגות ע”י בניית ביטויים דינאמיים בזמן ריצה, והרצתם

ואין גבול לדמיון למה שניתן לעשות עם יכולת כזאת.

בחזרה לעניינו – אנחנו מעוניינים לבצע Eval לאיזשהי מחרוזת. כיצד ניתן לעשות זאת?

בהמשך נראה מספר שיטות לבצע משימה זו.

סופ”ש עם הרבה הערכה טוב.

שתף