לוגו/הליכים
הקדמה
עריכהכל הפקודות שראינו עד עכשיו הן חד-פעמיות: הן יתבצעו ברגע שתכתבו אותן בחלון הפקודות (מיד לאחר שתקישו Enter) ואם תרצו לחזור עליהן שוב, תצטרכו לכתוב את כולן מחדש. כדי לחסוך כתיבה חוזרת זו של פקודות, ניתן להגדיר בלוגו "הליך" (procedure). הליך הוא מעין תוכנית קטנה, בעלת שם משלה. את ההליך ניתן להפעיל בכל עת, בעזרת שימוש בשם שניתן לו.
הליכים אינם קיימים רק בלוגו. הם קיימים בכל שפת תיכנות ראויה לשמה, תחת שמות שונים ("שגרות", "פונקציות" וכו'). השימוש בהליכים מאפשר למתכנת להגדיר "גוש" של פקודות המבצע פעולה מסויימת, ולתת ל"גוש" הזה שם מזהה. בעזרת שם זה, המתכנת יכול להפעיל את גוש הפקודות שכתב בכל עת שירצה בכך, כאילו היה מדובר בפקודה מובנית בתוך השפה. מתכנת המשתמש נכון בהליכים יכול לכתוב תוכניות שיהיו קצרות ונוחות לקריאה ולהבנה, הרבה יותר ממה שיכול היה לעשות ללא הליכים. מתכנת כזה יכול "למחזר" תוכניות שכתב - לקחת הליך מתוכנית א' והליך אחר מתוכנית ב', להוסיף הליך חדש שיקשר ביניהם - ולכתוב תוכנית חדשה. "מיחזור" כזה של קטעי תוכנית מאפשר כתיבה מהירה יותר של תוכניות חדשות, ונוחות רבה יותר בהכנסת שיפורים בתוכניות קיימות.
הגדרה של הליך חדש נעשית באמצעות הפקודה to ואחריה שם ההליך שרוצים להגדיר. יש מספר מגבלות על שם ההליך: אסור שיהיו בו הסימנים הבאים: / * - + = [ ] ( ) { } < > ; אסור ששם ההליך יתחיל בסימנים " ו- : (אבל הוא יכול להכיל אותם), אסור שיהיו בו רווחים, ואסור שהוא יכיל ספרות בלבד. במקום לזכור את המגבלות הללו, כדאי פשוט להקפיד לתת להליכים שמות פשוטים המכילים אותיות אנגליות, מספרים אם צריך, ותו שיסמן מתי נגמרת מילה ומתי מתחילה המילה הבאה - למשל הקו התחתון ("_", כלומר Shift וסימן החיסור).
איך כותבים הליך חדש
עריכהכיתבו את הפקודה to square והקישו על Enter. תוכנת MSWlogo תפתח חלון שיחה חדש. בחלון זה נקליד את פקודות ההליך החדש, שורה אחר שורה. כדי להוסיף שורה נוספת לחצו על ok או על Enter. כדי לסיים את ההליך לחצו על cancel או הקלידו את הפקודה end.
אם תקלידו בחלון ההליך את השורה [repeat 4 [fd 100 rt 90 ואז את השורה end, חלון ההליך ייסגר ובחלון הפקודות תופיע הודעה חדשה - square defined. ההליך החדש הוגדר ונכנס לתוך "אוצר המילים" של שפת לוגו.
מה יקרה אם ניתן להליך החדש שם שהוא זהה לשמה של אחת הפקודות בשפה? ראשית, די ברור שמדובר ברעיון לא מוצלח: כאשר אנו מגדירים הליך חדש אנו יוצרים פקודה חדשה בשפה, המצטרפת לאוצר המילים הקיים של לוגו. אם נגדיר הליך חדש בשם forward, למשל, הליך זה יתפוס את מקומה של הפקודה המניעה את הצב. במצב כזה, איך נוכל להורות לצב להתקדם??? בנוסף, מדובר ברעיון קשה לביצוע, שכן שפת לוגו מקשה עלינו "לדרוך" על הפקודות הקיימות בה: אם ננסה להגדיר הליך חדש בשם forward, חלון ההליך לא ייפתח. במקומו תופיע הודעה בחלון הפקודות - forward is already defined - כלומר, המילה forward כבר מוגדרת בשפת לוגו. הודעה דומה נקבל גם אם ננסה להגדיר שוב הליך בשם square, שכן לוגו מגנה גם על ההליכים שנכתבו על ידינו ומונעת מאיתנו לשנות אותם בטעות. ההבדל המרכזי בין ההגנה שהשפה נותנת לפקודות לוגו לבין זו שהיא נותנת להליכים שכתבנו בעצמנו היא, שאת ההליכים שלנו ניתן לערוך ולשנות גם אחרי שהוגדרו.
כתיבת הערות
עריכהאחת הסיבות שבגללן נרצה לערוך הליך שכתבנו תהיה הרצון להוסיף הערות. מתכנתים מוסיפים הערות כדי שאלה ייקראו על-ידי המתכנת עצמו או על ידי אדם אחר הקורא את התוכנית. המחשב מתעלם מההערות לגמרי, שכן הן כתובות בשפת בני-אדם ולא בלוגו. בהערות יכול המתכנת לציין מה אמור ההליך לעשות, מי כתב אותו ומתי, ואילו דברים כדאי לשנות בהליך הזה במועד מאוחר יותר. שימוש נוסף בהערות הוא לצורך מציאת שגיאות תיכנות ("באגים"). הרעיון הוא כזה: אם כתבנו תוכנית ארוכה והיא לא פועלת, או פועלת בדרך מוזרה, אנו יכולים להפוך חלק מהפקודות ל"הערות". המחשב יבצע את הפקודות האחרות, אלה שלא סומנו, ואנחנו נוכל לבדוק היכן בדיוק מתחילה ההתנהגות המוזרה של התוכנית. אם נראה שהכל בסדר, "נשחרר" אחת מהפקודות שסימננו (נמחק את סימן ההערה), ונאפשר למחשב לבצע גם אותה. כך נוכל לזהות איזו פקודה בדיוק יוצרת את הבעיות, וזאת ללא מחיקה וכתיבה של הפקודות מחדש.
שפת לוגו מאפשר להוסיף הערות בקלות. בהמשך השורה, לאחר סיום הפקודה, או אפילו בתחילתה של שורה חדשה, נכתוב את הסימן ";" (נקודה-פסיק) ואחריו נוסיף את הערותינו. כאשר MSWlogo מבצעת את הפקודות ונתקלת בסימן ההערה, היא מתעלמת מכל מה שכתוב אחריו (רק עד לסוף השורה!). ההערה קיימת, ומי שקורא את התוכנית יראה אותה, אבל המחשב מתעלם ממנה לגמרי.
עריכת הליכים
עריכהכדי לשנות הליך שכבר הוגדר (למשל, כדי שנוכל להוסיף הערות להליך square), כוללת MSWlogo מסך עריכת הליכים. כדי להפעיל אותו עלינו להקליד בחלון הפקודות את הפקודה edit ואחריה את שם ההליך עם הסימן " (גרשיים, לא שני גרשים בודדים) בתחילתו - edit "square.
הפקודה תפתח חלון, שבו יופיע ההליך כשבתחילתו to square, בדיוק כפי שכתבתם אותו מלכתחילה, ובסופו End. כל הליך חייב להתחיל במילה to ולהסתיים במילה end. חלון ההליך מוסיף את ה End באופן אוטומטי כשאנו לוחצים על הכפתור cancel, אבל כדאי להתרגל להוסיף את המילה הזו בעצמנו. מילה זו היא חשובה שכן "גבולות" ההליך נקבעים על ידי הפקודות to ו end ותוכן ההליך כולל את כל הפקודות הנמצאות ביניהן, ורק אותן.
בתוך מסך העריכה אנחנו יכולים לשנות את ההליך כרצוננו. אתם מוזמנים להוסיף הערות המסבירות מה עושה ההליך square וכיצד. כדי לצאת ממסך זה, בחרו (בתפריט שבראש החלון) את האפשרות file ובתפריט שנפתח בחרו save and exit. לוגו שומרת את השינויים שערכתם, מעדכנת את אוצר המילים שלה בהתאם, וחלון העריכה - נסגר.
אם נרצה לחזור ולערוך את ההליך נוכל להשתמש בפקודה edall ללא שם הליך אחריה. פקודה זו פותחת את מסך העריכה ובו כל ההליכים שהוגדרו על-ידינו. כעת נוכל לערוך אותם ואפילו ליצור הליכים חדשים (תוך הקפדה על "תחביר" לוגו תקין). העריכה כאן היא נוחה יותר מבחלון ההליך, משום שבמסך העריכה כל שורות ההליך נמצאות מול עינינו בו-זמנית.
הפעלת הליכים
עריכההשימוש בהליך שהוגדר הוא פשוט מאוד: מרגע שהליך הוגדר, שמו משמש כפקודה. כתיבת שם ההליך תגרום לביצועו.
כל הליך חדש יכול לעשות שימוש בהליכים שהוגדרו כבר. כדי לצייר בית, למשל, ניתן להשתמש בהליך המצייר ריבוע ובהליך המצייר משולש. ההליך החדש - to house - יכלול את ה"פקודה" (בעצם - ההליך) square, ואת ה"פקודה" triangle ("משולש"). בין שתי ההוראות הללו נצטרך להוסיף כמה פקודות לוגו שיעבירו את הצב מהנקודה שבה הסתיים ציור הריבוע אל הנקודה שבה מתחיל ציור המשולש. כדי להקל את העבודה עם תתי-הליכים, מומלץ לעשות אותם "הליכים מסודרים". "הליך מסודר" הוא כזה שמיקום הצב וזווית הראש שלו בסופו (של ההליך) זהים לאלו שבתחילתו. בעבודה עם הליכים "מסודרים" אנחנו לא צריכים לבדוק את ההליך בנפרד כדי לדעת מה יהיה מצבו של הצב בסוף ביצוע ההליך.
פלט וקלט בהליכים
עריכהיש הליכים המבצעים תמיד אותה פעולה (דוגמה אפשרית היא הפקודה המנקה את המסך - clearscreen - פקודה זו לא זקוקה לשום קלט מהמשתמש, והיא אינה מחזירה למשתמש מידע כלשהו, אלא רק מנקה את המסך. דוגמה אחרת היא ההליך המצייר ריבוע). יש הליכים אחרים, אשר מצפים לקלט מהמשתמש ומנצלים את הקלט הזה לצורך פעולתם (כמו הפקודה forward, למשל, המצפה מהמשתמש לקבוע כמה צעדים יתקדם הצב). יש גם הליכים המבצעים פעולה מסוימת ומחזירים תוצאה. החזרת התוצאה מההליך נעשית באמצעות הפקודה output, או בקיצור op. הנה לדוגמא, הליך הפולט את זווית הראש של הצב, לפי השיטה המקובלת (0 הוא הכיוון החיובי של ציר ה-x, ההתקדמות היא נגד כיוון השעון):
to angle
;Returns the angle in which the turtle is facing
;in the normal system (up=90, down=270 and so on).
op 90-heading
End
- מה עושה ההליך angle?
- השורה הראשונה מגדירה את ההליך, ומאפשרת לנו להפעיל אותו בעזרת כתיבת המילה angle בחלון הפקודות.
- שתי השורות הבאות אינן עושות דבר. מדובר בהערות (שימו לב לתו ; בראשית כל שורה). ההערות מסבירות מה ההליך אמור לעשות, אבל הן אינן מסבירות כיצד הוא פועל.
- השורה הבאה היא שורה של פקודות לוגו. לוגו תזהה בה את הפקודה op ולכן היא "יודעת" ששורה זו עומדת להחזיר פלט. אבל מה יהיה הפלט הזה? כנראה שהתשובה צריכה להימצא בביטוי המופיע אחרי הפקודה op. מדובר בביטוי המורכב משני רכיבים שביניהם סימן החיסור, ולכן לוגו "מבינה" כי מדובר בביטוי חשבוני שעליה לחשב את תוצאתו. בתחילה זה לא נראה מסובך, שהרי המספר 90 הוא מספר קבוע ואינו בעייתי. אך מה יש לחסר מהמספר 90? מה זה heading?
- כזכור, heading היא פקודה המחזירה את זוית הראש של הצב במונחי לוגו - כלומר, 0 (המספר אפס), פירושו "הצב פונה כלפי מעלה".
- כאשר לוגו נתקלת בשם של פקודה, היא מפעילה אותה ובודקת אם יש לפקודה פלט. במקרה של heading הפלט הוא מספר (זוית הראש של הצב). מספר זה "מוכנס" לתוך הביטוי החשבוני, וכעת עומדת לוגו בפני פעולה חשבונית חוקית - חיסור מספר ממספר. לוגו מבצעת את פעולת החיסור ומחזירה כפלט את התוצאה (שגם היא מספר). כעת הפלט הופך לקלט, הפעם מדובר בקלט של הפקודה op. פקודה זו מחזירה את הפלט של ההליך angle, וההליך מסתיים.
- השורה הראשונה מגדירה את ההליך, ומאפשרת לנו להפעיל אותו בעזרת כתיבת המילה angle בחלון הפקודות.
אתם מוזמנים לנסות את ההליך. מה, למשל, תהיה תוצאת ההליך הזה כאשר הצב פונה שמאלה (כמו שעה 9 בשעון)?
כאשר ננסה להפעיל את ההליך angle אנו עלולים לחשוב שהוא "לא עושה כלום". בחלון הפקודות תופיע לנו ההודעה "You don't say what to do with 90". הסיבה לכך היא, שביקשנו מההליך להחזיר לנו מידע, אבל לא עשינו כלום עם המידע הזה. לא הורינו ללוגו מה לעשות בפלט של ההליך. כדי לפתור את הבעיה נכתוב פקודה כמו print angle. הפקודה print היא פקודת ההדפסה. הצירוף print angle אינו מדפיס לנו את ההליך angle וגם לא את המילה angle, אלא את תוצאתו של ההליך הזה, את הפלט שלו. קודם לוגו מבצעת את ההליך angle, ואז היא ניגשת לבצע את הפקודה print. הפלט של ההליך angle הוא הקלט של הפקודה print.
בעצם יש לנו כאן שרשרת של גילגולים של "פלט" ל"קלט". הפלט של הפקודה heading הוא מעין "קלט" עבור הביטוי החשבוני. הפלט של הביטוי החשבוני הוא קלט של הפקודה op. הפלט של op הוא גם הפלט של ההליך angle, והוא משמש כקלט עבור הפקודה print. print עצמה אינה מחזירה פלט, אלא היא מדפיסה אל המסך.
ניהול ההליכים ושמירתם
עריכהכדי לראות רשימה של כותרות כל ההליכים שהגדרתם, ניתן להשתמש בפקודה pots. פקודה זו תדפיס למסך את כותרות ההליכים הללו, כולל המילה to לפני שם ההליך. כדי לראות גם את גוף ההליך, השתמשו בפקודה poall אשר תדפיס את כל ההליכים במלואם. כדי לראות הליך בודד, אך מבלי לערוך אותו השתמשו בפקודה po "name, כאשר name הוא שם ההליך. שימו לב, חשוב לשים את הגרשיים, אחרת הפקודה po תחזיר הודעת שגיאה (חסר קלט), וההליך name יתבצע. דרך נוחה יותר לראות את כל ההליכים שהגדרנו היא הקלקה על הכפתור Edall במסך הפקודות (או כתיבת הפקודה edall בשורת הפקודות]. פעולה זו תפתח מסך עריכה הזהה לזה שנפתח בפקודה edit, ובו כל ההליכים. הבחירה בפקודה edit מאפשרת גם לערוך את ההליכים, מה שהפקודות po ו-poall אינן מאפשרות.
כאשר תרצו לשמור קובץ לוגו יהיה עליכם לבחור את האפשרות SaveAs מהתפריט file ולתת לקובץ שם באנגלית. מה שיישמר יהיה כל ההליכים שהוגדרו, כפי שהם מופיעים ב-Edall. אם תרצו לשמור תמונה שציירתם בלוגו עליכם לעשות זאת דרך התפריט bitmap, שם תוכלו לבחור אם לשמור את התמונה שעל המסך כקובץ bmp או gif.
הפרק הקודם: מערכת הקואורדינטות |
הליכים | הפרק הבא: משתנים |