درس ۸ از ۲۵ · جریان برنامه

همخوان و ترابرد

وقتی یک مقدار چند حالت ممکن دارد، به‌جای زنجیره‌ای از اگرها از همخوان یا ترابرد استفاده کنید.

همخوان

همخوان یک عبارت است: مقدار را با حالت‌ها مقایسه می‌کند و نتیجه‌ی شاخه‌ی جورشده را برمی‌گرداند. چند حالت می‌توانند با ویرگول یک شاخه را شریک شوند و وگرنه همه‌ی حالت‌های دیگر را می‌گیرد.

match-values.salam
روال رده(نمره: صحیح): رشته:
    برگشت همخوان نمره / ۱۰:
        ۱۰، ۹ => "عالی"
        ۸ => "خیلی خوب"
        ۷ => "خوب"
        وگرنه => "نیاز به تلاش"
    پایان
پایان

روال ریشه:
    سرچاپ رده(۹۵)، رده(۸۰)، رده(۴۵)
پایان
خروجیعالی خیلی خوب نیاز به تلاش

روی جداشمارها، همخوان بررسی می‌کند که هیچ حالتی از قلم نیفتاده باشد:

match.salam
جداشمار فصل:
    بهار، تابستان، پاییز، زمستان
پایان

روال هوا(ف: فصل): رشته:
    برگشت همخوان ف:
        بهار, پاییز => "معتدل"
        تابستان => "گرم"
        زمستان => "سرد"
    پایان
پایان

روال ریشه:
    سرچاپ "هوای بهار:", هوا(فصل.بهار)
    سرچاپ "هوای زمستان:", هوا(فصل.زمستان)
پایان
خروجیهوای بهار: معتدل هوای زمستان: سرد

ترابرد

ترابرد دستوری برای انتخاب میان حالت‌هاست. برچسب هر حالت می‌تواند یک مقدار، چند مقدار با ویرگول یا یک بازه مثل ۱ تا ۳ باشد. اگر حالتی با بشکن تمام نشود، اجرا به حالت بعدی هم می‌رود؛ پس هر جا نمی‌خواهید، بشکن بنویسید.

switch.salam
روال ریشه:
    تکرار ۵ در روز:
        ترابرد روز:
            ۰:
                سرچاپ روز, "شنبه، آغاز هفته"
                بشکن
            پایان
            ۱ تا ۳:
                سرچاپ روز, "میانه‌ی هفته"
                بشکن
            پایان
            وگرنه:
                سرچاپ روز, "نزدیک تعطیلی"
            پایان
        پایان
    پایان
پایان
خروجی0 شنبه، آغاز هفته 1 میانه‌ی هفته 2 میانه‌ی هفته 3 میانه‌ی هفته 4 نزدیک تعطیلی

برچسب ترابرد می‌تواند با یک عملگر مقایسه شروع شود، مثل >= ۹۰. ترابرد درست هم جای زنجیره‌ی اگرها را می‌گیرد: هر برچسب یک شرط است و نخستین شرط درست اجرا می‌شود.

switch-true.salam
روال ریشه:
    تکرار ۳ در ای:
        دما := ای * ۱۵
        ترابرد درست:
            دما < ۱۰:
                سرچاپ دما, "سرد"
                بشکن
            پایان
            دما < ۲۵:
                سرچاپ دما, "معتدل"
                بشکن
            پایان
            وگرنه:
                سرچاپ دما, "گرم"
            پایان
        پایان
    پایان
    نمره := ۷۵
    ترابرد نمره:
        >= ۹۰:
            سرچاپ "عالی"
            بشکن
        پایان
        >= ۶۰:
            سرچاپ "قبول"
            بشکن
        پایان
        وگرنه:
            سرچاپ "مردود"
        پایان
    پایان
پایان
خروجی0 سرد 15 معتدل 30 گرم قبول

الگوی ساختار

همخوان می‌تواند یک ساختار را با فیلدهایش بسنجد. ایکس = ۰ یعنی فیلد باید برابر صفر باشد و نام تنها، مثل ایگرگ، مقدار فیلد را در متغیری به همان نام می‌گذارد. چون الگوها شرط دارند، یک وگرنه در پایان لازم است.

match-struct.salam
ساختار نقطه:
    همگانی ایکس: صحیح = ۰
    همگانی ایگرگ: صحیح = ۰
پایان

روال جای(ن: نقطه): رشته:
    برگشت همخوان ن:
        نقطه { ایکس = ۰، ایگرگ = ۰ } => "مبدأ"
        نقطه { ایکس = ۰، ایگرگ } => "روی محور عمودی، ایگرگ = " + ایگرگ
        نقطه { ایکس، ایگرگ = ۰ } => "روی محور افقی، ایکس = " + ایکس
        وگرنه => "جای دیگر"
    پایان
پایان

روال ریشه:
    سرچاپ جای(نقطه {})
    سرچاپ جای(نقطه { ایگرگ = ۵ })
    سرچاپ جای(نقطه { ایکس = ۳ })
    سرچاپ جای(نقطه { ایکس = ۱، ایگرگ = ۲ })
پایان
خروجیمبدأ روی محور عمودی، ایگرگ = 5 روی محور افقی، ایکس = 3 جای دیگر

همخوان را وقتی به کار ببرید که به یک مقدار نیاز دارید یا می‌خواهید مترجم کامل بودن حالت‌ها را بسنجد؛ ترابرد برای وقتی است که در هر حالت چند دستور اجرا می‌کنید.