פונקציות אנונימיות בתכנות פרוצדורלי

מאז שנות ה70 בערך, לא נוצרה שום טכנולוגיה חדשה בנושא עולם התכנות. אפילו תכנות מקביל (parallel programming) אינו המצאה חדשה. למרות שכיום הטרנד (מה המילה העברית לזה ?) הוא להשתמש בעיקר בשפות דינאמיות ופונקציונאליות, או סתם שפות מתפרשות בזמן ריצה (כדוגמת ג'אווה), אין שום דבר חדש כאן. החידוש נעשה בשנות ה60 וה70, ששם הם הרעיונות הומצאו בעצם

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

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

...
type
  TMyProc = reference to procedure(x: Integer);
...
 procedure call(const proc: TProc);
  begin
    proc(42);
  end;

  var
    proc: TProc;
  begin
    proc := procedure(a: Integer)
    begin
      Button1.Caption := IntToStr(a)
    end;
    call(proc)
  end;
...

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

4 מחשבות על “פונקציות אנונימיות בתכנות פרוצדורלי

  1. שי

    בשנות התשעים נעשו כמה התקדמויות מרשימות מאוד בעולם התכנות, ובשנות האלפיים כמה מהן הונגשו והוספו לשפות שהן פחות או יותר mainstream. ההתקדמויות נעשו ברובן בעולם הפונקציונאלי; כך, למשל מערכות טיפוסים מסוג Hindley-Milner, עם הסקה אוטומטית של טיפוסים, הופיעו לראשונה בשפות ממשפחת ML, אבל הרעיון הכללי (הסקת טיפוסים) הגיע לאחרונה ל־C#‎ ואפילו ל־C++‎.

    חשיבותן העיקרית של פונקציות אנונימיות היא כאשר אתה יכול לכתוב אותן כביטוי בתוך שורה, כלומר, כשגוף הפונקציה הוא שורה אחת ואתה לא צריך לכתוב כותרת. lambda של פייתון עושה את זה בצורה לא כל כך מוצלחת, C#‎ מראה שאפשר לעשות את זה יפה גם בשפה שהיא בעיקרה פרוצדוראלית, בעזרת קצת הסקת טיפוסים או תמיכה בגנריות (‎x=>x++‎ היא פונקציה שמגדילה את x, למשל).

    לדעתי, כל עוד תומכי ה־feature הזה לא מוכנים (או יכולים) להסיר מהפונקציה האנונימית את הכותרת, ה־begin וה־end, התוצאה היא ארוכה ומסורבלת מדי כדי להיות שימושית.

    1. ik_5 מאת

      אתה מתכוון כמו inc וdec שיש בפסקל שאפילו מסוגלות לקבל עוד פרמטר בכמה להוסיף או להוריד (אבל עובדות רק על משתנים ולא על תכונות למשל) ?

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

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

      1. שי

        לגבי dec ו־inc: כן, אבל לא זו הנקודה; הנקודה היא התחביר var=>expr שמגדיר פונקציה. אם בשביל לכתוב פונקציה אתה ממילא צריך לכתו חמש שורות, ה„מחיר” של הוספת שם לפונקציה הוא לא כזה נורא. אם היית יכול לכתוב בקוד שלך משהו כמו

        button1.OnClick(=>button2.Caption=IntToStr(a));‎

        (כלומר: צור פונקציה ללא ארגומנטים, שמשנה את ה־Caption של button2, וחבר אותה כ־callback ל־button1) אז היית מרויח אקספרסיביות וקריאות, לטעמי. עם התחביר שהדגמת, כבר עדיף שלפונקציה יהיה שם (למשל: SetButton2Title) – יהיה כך קל יותר להבין את השורה שמחברת את ה־callback.

        גם בגׁ׳אווהסקריפט התחביר של פונקציות אנונימיות מסורבל ועילג, וגם שם אפשר (ולפעמים עדיף) להשתמש בפונקציות עם שמות בתור callback־ים.

  2. פינגבק: אותותרבות #10 – CTRLALTNEU.NET

להשאיר תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s