FPC לאן – פוסט תקופתי

עכשיו אחרי ש FPC 2.4.0 שוחררה לעולם, אני יכול לדבר על עץ הפיתוח שאני עוקב אחריו באמת וזה 2.5.1. זהו עץ שיהיה בסופו של דבר גרסה 2.6.0.

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

אינני יודע אם למשל הדבר הבא נכנס ל 2.4.0, אבל הוא קיים ב 2.5.1:

var
   s : string;
...
case s of
  'String1' : ...;
  'String2' : ...;
  ...
end;
...

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

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

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

  1. תמיכה בתחביר for in
  2. תמיכה במחלקות הניתנות לאיטרציה על ידי הגדרת אופרטור בתוך מחלקה למניה בשם Enumerator וכמה פונקציות

דוגמא ל for in אפשר לראות בצורה הבאה:

procedure StringLoop(S: String);
var 
  C : Char;
begin
  for C in S do
    DoSomething(C);
end;

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

השימוש במחלקות עבור איטרציה פשוטה מאוד בתפיסה שלה. המחלקה היא סוג של מיכל עבור מידע ויש לעבוד עם תבנית של Next עבור גילוי המידע על ידי מימוש אופרטור של אנומרציה בשם Enumerator (אשר אינו תואם את דלפי, עבור תאימות דלפי יש interface בשם IEnumerator במקום).

מבנה מחלקה המבצעת אנומרציה תראה כך:

TSomeEnumerator = class
public
  function MoveNext: Boolean;
  property Current: TSomeType;
end;

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

type
  TEnumerableTree = class;
  TTreeEnumerator = class
  private
    FTree: TEnumerableTree;
    FCurrent: TNode;
  public
    constructor Create(ATree: TEnumerableTree);
    function MoveNext: Boolean;
    property Current: TNode read FCurrent;
  end;

  TEnumerableTree = class
  public
    function GetEnumerator: TTreeEnumerator;
  end;

constructor TTreeEnumerator.Create(ATree: TEnumerableTree);
begin
  inherited Create;
  FTree := ATree;
  FCurrent := nil;
end;

function TTreeEnumerator.MoveNext: Boolean;
begin
  // some logic to get the next node from a tree
  if FCurrent = nil then
    FCurrent := FTree.GetFirstNode
  else
    FCurrent := FTree.GetNextNode(FCurrent);
  Result := FCurrent <> FTree.GetLastNode;
end;

function TEnumerableTree.GetEnumerator: TTreeEnumerator;
begin
  Result := TTreeEnumerator.Create(Self);
end;

וככה יש לנו קוד התואם את דלפי ומסוגל לבצע מניה של איברים.

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

הסיבה לכל החידושים האלו הופכת את הגרסה הזו למעניינת מאוד ושווה לחכות לה כשתשוחרר.

4 מחשבות על “FPC לאן – פוסט תקופתי

  1. ik_5 מאת

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

  2. פינגבק: class var « לראות שונה

  3. פינגבק: FPC 2.6.0 שוחררה | לראות שונה

כתיבת תגובה

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

הלוגו של WordPress.com

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

תמונת Twitter

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

תמונת Facebook

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

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

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

מתחבר ל-%s