תוכן עניינים הקדמה
הכרות עם schemes
תבניות נתונים
תבניות
משפטי בקרה
משתנים לקסיקלים
רקורסיה
קלט/פלט
macros
מבנים
alises and tables ממשק המערכת
מחלקות ואובייקטים
jumps
אי-דטרמיניסטיות
מנועים
shell scripts
אתר ללימוד מקיף> פרק 4 - משפטי בקרה

פרק 4 - משפטי בקרה


הנושאים בפרק זה:
4.1.      when ו-unless
4.2.     cond
4.3.     case
4.4.    'and' ו-'or'


כמו בכל השפות גם ל- scheme יש משפטי תנאי. התבנית הבסיסית היא:

(if  test - expression
              than - expression   
                                  else - expression)  

אם ה-test-expression הוא אמת (ערך השונה מ-f#) אז יוערך הביטוי then-expression אחרת יוערך הביטוי else-expression.

(define p 90)

(if (> p 70) 'safe 'unsafe) => safe (if (< p 90) 'low-pressure) ;no ``else'' branch => low-pressure

ל-Scheme יש תבניות נוספות של משפטי תנאי. הם יוגדרו כמאקרו (פרק 8), המורחב לביטוי תנאי.



לתחילת העמוד

when 4.1 ו-unless

when ו-unless נוחים לשימוש במשפטי בקרה כאשר יש רק הסתעפות אחת (כלומר יש הסתעפות ל-"then" או "else") בתבנית הבסיסית .

(when (< (pressure tube) 60)
   (open-valve tube)
   (attach floor-pump tube)
   (depress floor-pump 5)
   (detach floor-pump tube)
   (close-valve tube))

בהנחה ש-pressure tube < 60 אזי יתבצע

(attach floor-pump tube) ו-(depress) floor-pump 5

(attach ו-depress הן פרוצדורות מתאימות) .

כעת נתבונן באותה דוגמא אך נשתמש ב-if במקום when:

(if (< (pressure tube) 60)
    (begin
      (open-valve tube)
      (attach floor-pump tube)
      (depress floor-pump 5)
      (detach floor-pump tube)
      (close-valve tube)))

יש לשים לב כי בשימוש ב-when לא היה צורך להשתמש ב-begin ואילו ב-if יש צורך להשתמש בו.
unless מתנהג באופן דומה כמתואר בדוגמא הבאה:

(unless (>= (pressure tube) 60)
   (open-valve tube)
   (attach floor-pump tube)
   (depress floor-pump 5)
   (detach floor-pump tube)
   (close-valve tube))

לא בכל השפות Scheme קיימים when ו-unless לעתים נצטרך להגדירם כפי שנלמד בפרק 8.



לתחילת העמוד

4.2 Cond

התבנית של cond נוחה לשימוש כאשר משתמשים במשפטי בקרה בצורה מקוננת

(if (char <? c #\c) -1
    (if (char=? c #\c) 0
        1))

הקוד הנ"ל ע"י שימוש ב-cond:


(cond ((char<? c #\c) -1)
      ((char=? c #\c) 0)
      (else 1))

ה-cond משמש למשפטי תנאי מסועפים. כאשר לכל close יש ביטוי הנבדק וביטוי הצריך להתבצע. הביטוי הראשון שמצליח, מפעיל את הביטוי השייך אליו. ה-else המסיים נבחר כאשר אף אחד מהביטויים הקודמים לא הצליח.
בפעולות ה-cond יש begin במרומז ולכן אין צורך לכתוב זאת במפורש.



לתחילת העמוד

4.3 Case

מצב מיוחד ל-cond היכול להיות מתומצת לביטוי case. זה אפשרי כאשר כל הביטויים הנבדקים שייכים לאותו ביטוי כלומר:

(case c
  ((#\a) 1)
  ((#\b) 2)
  ((#\c) 3)
  (else 4))
=>  3

ה-close שראשו מכיל את הערך של c יבחר.



לתחילת העמוד

and' 4.4' ו-'or'

Scheme מספקת תבניות מיוחדות עבור ביטויים בוליאניים 'and' ו-'or'.
התבנית המיוחדת 'and' מחזירה אמת אם כל תת התבניות שלה הן אמת. הערך המוחזר הוא סיכום של כל התת תבניות. אם אחת מהתת תבניות היא שקר אזי הערך המוחזר הוא שקר (f#).

לדוגמא:

(and 1 2)  =>  2
(and #f 1) =>  #f
התבנית המיוחדת 'or' מחזירה ערך אמת אם לפחות אחד מערכי הביטויים הוא אמת. אם כל ערכי הביטויים הם שקר 'or' תחזיר שקר (#f).
לדוגמא:

 (or 1 2) => 1
 (or #f 1) => 1 

'and' ו-'or' מעריכים את התת תבניות שלהם משמאל לימין. אם התוצאה נקבעה כבר Scheme תתעלם משאר הביטויים.

(and 1 #f expression-guaranteed-to-cause-error)
=>  #f

(or 1 #f expression-guaranteed-to-cause-error)
=>  1