درس ۹ از ۲۵ · روال‌ها

روال‌ها

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

تعریف و فراخوانی

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

functions.salam
روال فیبوناچی(ن: صحیح): صحیح:
    اگر ن < ۲:
        برگشت ن
    پایان
    برگشت فیبوناچی(ن - ۱) + فیبوناچی(ن - ۲)
پایان

روال ریشه:
    تکرار ۱۰ در ک:
        چاپ فیبوناچی(ک), ""
    پایان
    سرچاپ ""
پایان
خروجی0 1 1 2 3 5 8 13 21 34

مقدار پیش‌فرض

ورودی‌هایی که مقدار پیش‌فرض دارند در فراخوانی اختیاری‌اند. روالی که خروجی ندارد گونه‌ی خروجی نمی‌خواهد.

fn-params.salam
روال خوشامد(نام: رشته، پیشوند: رشته = "سلام"):
    سرچاپ پیشوند + "،", نام
پایان

روال مساحت(پهنا: صحیح، بلندی: صحیح = ۱): صحیح:
    برگشت پهنا * بلندی
پایان

روال ریشه:
    خوشامد("مینا")
    خوشامد("مینا"، "درود")
    سرچاپ مساحت(۴)، مساحت(۴، ۵)
پایان
خروجیسلام، مینا درود، مینا 4 20

گونه‌ی خروجی خودکار

اگر گونه‌ی خروجی را ننویسید، سلام آن را از برگشت‌ها می‌فهمد:

fn-infer.salam
روال میانگین(الف: اعشار۶۴، ب: اعشار۶۴):
    برگشت (الف + ب) / ۲.۰
پایان

روال بیشینه(الف: صحیح، ب: صحیح):
    اگر الف > ب:
        برگشت الف
    پایان
    برگشت ب
پایان

روال ریشه:
    سرچاپ میانگین(۳.۰، ۴.۰)، بیشینه(۸، ۳)
پایان
خروجی3.5 8

هم‌نامی

چند روال می‌توانند یک نام داشته باشند، به شرطی که گونه‌ی ورودی‌هایشان فرق کند؛ سلام از روی آرگومان‌ها روال درست را انتخاب می‌کند.

fn-overload.salam
روال دوبرابر(عدد: صحیح): صحیح:
    برگشت عدد * ۲
پایان

روال دوبرابر(متن: رشته): رشته:
    برگشت متن + متن
پایان

روال ریشه:
    سرچاپ دوبرابر(۲۱)
    سرچاپ دوبرابر("ها")
پایان
خروجی42 هاها

نام‌های چندواژه‌ای

نام روال هم می‌تواند چندواژه‌ای باشد تا کد مثل جمله خوانده شود:

fn-multiword.salam
روال آخر هفته است(روز: صحیح): منطقی:
    برگشت روز == ۶ یا روز == ۷
پایان

روال ریشه:
    سرچاپ آخر هفته است(۶)، آخر هفته است(۲)
پایان
خروجیtrue false

ورودی ارجاعی

ورودی‌ها به‌طور پیش‌فرض کپی می‌شوند و تغییرشان بیرون روال دیده نمی‌شود. اگر پس از نام ورودی &: بنویسید، روال به خودِ متغیر فراخواننده دسترسی پیدا می‌کند و می‌تواند تغییرش دهد.

fn-ref.salam
روال افزایش(عدد &: صحیح):
    عدد = عدد + ۱
پایان

روال بی‌اثر(عدد: صحیح): صحیح:
    برگشت عدد + ۱
پایان

روال ریشه:
    ناپایا امتیاز := ۱۰
    افزایش(امتیاز)
    افزایش(امتیاز)
    سرچاپ امتیاز, بی‌اثر(امتیاز), امتیاز
پایان
خروجی12 13 12