lambda ללא λ

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

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

בואו נכתוב פונקציה מאוד פשוטה:

function ReturnSomething : integer;
var
X : integer;

procedure print_double_X;
begin
writeln(X * 2);
end;

begin
X := 2;
print_double_X; { print 4 }
end;

כמו שאפשר לראות, יש לי תמיכה ב nested functions בפסקל ואם אני כותב משתנים לפני ההגדרה, אז אפשר גם לגשת אליהם דרך אותן פונקציות, מה שבעצם גורם למצב שמתנהג כמעט לגמרי זהה ל lambda. כמובן שתלוי עד כמה "גבוהה" רוצים להגיע כאשר מדברים על lambda, אבל אני יכול ליצור עכשיו בתוך nested function עוד nested function וכו' וככה להשיג הרבה אפקטים זהים כמעט ב100%.

הרעיון של להבין שפות תכנות הוא פשוט: לא תמיד חוסר בכלי מסויים אומר שאי אפשר לקבל את אותו אפקט, משהו שהרבה מתכנתים לא מבינים. זה לא השם של הכלי, זה לא אם הוא קיים, זה האם אפשר להגיע למצב שבו צריך כלי כזה כאשר מתכנתים בגישה של השפה. בשפת פסקל, בד"כ (בלמעלה מ 90%) הרבה מהכלים למשל ש ++C מספק לא נחוצים בכלל בשביל לתת פתרון ולכן עצם ההשוואה שארתיום ערך אינה נכונה -> היא לא משווה דרכי פעולה היא משווה כלים. באותה מידה אפשר לשאול "אם ++C מספקת כל כך הרבה כלים, ועדיין יש הרבה טכנולוגיות שמצליחות לעשות אותו הדבר בלי אותן טכנולוגיות, מה השפה הזו בעצם מספקת ?" התשובה היא כמובן לא הרבה, כי אין לה יתרון אם לא צריך את כל הטכנולוגיות שהיא מספקת (בייחוד שצריך עדיין עזרה של הרבה ספריות בשביל להשתמש בהם) אם אפשר לעבוד בצורה טובה ויעילה בלעדיהם בכל כך הרבה טכנולוגיות אחרות.

אה ועוד משהו, כמו שאמרתי, FPC זה מהדר לא שפה, והקוד שכתבתי כאן יעבוד בכל מהדר פסקל.

5 מחשבות על “lambda ללא λ

  1. ארתיום

    עידו, אני אמרתי "בבית הקפה הזה לא מגישים קפה", ואתה אמרת: "אתה לא מבין, יש לנו תה, בו גם יש קפאין".

    מה טוב לי הקפאין אם אני רוצה קפה?

    עכשיו אני אסביר… כל דבר אפשר לעשות בכל שפה כל עוד היא turing complete.

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

    אם כבר, הייתי מביא דוגמה שונה שבאמת מאפשרת הרכבה של פונקציות בסגנון Lambda ולא פונקציה מקוננת:

    TUnaryFunction = abstract object
    function calc(x:Integer) : Integer ; abstract;
    destructor Destroy; virtual;
    end;
    PUnaryFunction = ^TUnaryFunction;

    TNegate = object(TUnaryFunction)
    constructor Init;
    function calc(x:Integer) : Integer ; virtual;
    end;
    TDouble = object(TUnaryFunction)
    constructor Init;
    function calc(x:Integer) : Integer ; virtual;
    end;

    TCompose = object(TUnaryFunction)
    private
    fFirst,fSecond:PUnaryFunction;
    public
    constructor Init(aFirst,aSecond:PUnaryFunction);
    function calc(x:Integer) : Integer ; virtual;
    destructor Destroy; virtual;
    end

    ואז מציג פונקציה:

    function ComposeThem(first,second:PUnaryFunction) : PUnaryFunction;
    var
    cmp: ^TCompose;

    begin
    new(cmp,Init(first,second));
    return cmp;
    end;

    שעושה הרבה… אבל… בצורה כזו בכל השפות יש Lambda😉 גם ב־C.

    אני בסה"כ השוויתי גישות שונות: ברור שב־Pascal אני אכתוב אחרת מאשר שאני כותב ב־C או ב־Java וכמובן שונה ממה שאני אכתוב ב־C++‎.

    ועוד, לידיעתך… ידעתי Pascal הרבה לפני שידעתי C וכמובן גם C++‎. כך שתאמין לי שאני יודע דבר או שניים על איך כותבים ב־Pascal, אפילו שהדברים התקדמו מאז.

  2. shlomil

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

  3. רם-און

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

כתיבת תגובה

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

הלוגו של WordPress.com

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

תמונת Twitter

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

תמונת Facebook

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

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

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

מתחבר ל-%s