العرضar

Functions and control flow

Functions#

الدوال في Faber تُصرَّح باستخدام دالة، مع صيغة المعاملات بذكر النوع أولاً ونوع الإرجاع برمز.

الصيغة الأساسية#

دالة twice(عدد n) → عدد {
    أعد n
}

مع قناة أخطاء:

دالة parse(نص input) → عدد ⇥ نص {
    أعد 0
}

أمثلة#

# No parameters, no return
دالة saluta() → فراغ {
    اعرض "Salve, Mundus!"
}

# Parameter, no explicit return
دالة dic(نص verbum) → فراغ {
    اعرض verbum
}

# Parameter and return type
دالة duplica(عدد n) → عدد {
    أعد n * 2
}

# Multiple parameters
دالة adde(عدد a, عدد b) → عدد {
    أعد a + b
}

قيم الإرجاع#

استخدم أعد للإرجاع العادي:

دالة porta(عدد x) → عدد {
    إذا x ≺ 0 إذن أعد 0
    أعد x * 2
}

أعد مجردة لنوع الإرجاع فراغ:

دالة tace() → فراغ {
    أعد
}

الاستعارة وقابلية التعديل (عن, in, من)#

يُحدد Faber كيفية تمرير القيمة باستخدام حروف جر قصيرة على المعاملات:

العلامةالغرضالتخفيض النموذجي إلى Rust
(بدون)قيمة مملوكةT بالقيمة
عناستعارة مشتركة (للقراءة فقط)&T
فياستعارة قابلة للتعديل&mut T
ملكاستهلاك (نقل إلى الدالة المستدعاة)T بالنقل
# Shared borrow
functio imprime(de textus label) → vacuum {
    nota label
}

# Mutable borrow
functio duplica(in numerus value) → vacuum {
    value ← value * 2
}

# Consume
functio consume(own textus buffer) → textus {
    redde buffer
}

# Owned
functio salve(textus nomen) → textus {
    redde "Salve, §!"(nomen)
}

الكلمات نفسها (عن, من) تُعاد استخدامها في تراكيب أخرى — لا تقرأ كل من بمعنى "استهلاك":

السياقالدور
عن نص name على معاملاستعارة مشتركة
في عدد count على معاملاستعارة قابلة للتعديل
ملك نص buffer على معاملنقل إلى الدالة المستدعاة
كرر من items ثابت itemتكرار على القيم
كرر عن جدول ثابت keyتكرار على المفاتيح
من source ثابت x, باقي restتفكيك الحقول
استورد من "path"استيراد من وحدة

نقطة الدخول#

نقطة دخول البرنامج هي بداية:

بداية {
    اعرض "ingressus"
}

نقطة دخول CLI#

بالنسبة لبرامج CLI، تستقبل بداية وسائط معاملات سطر الأوامر المُحلَّلة:

@ cli "echo"
@ descriptio "Prints text"
@ operandus ceteri textus words
incipit argumenta args {
    itera ex args.words fixum word {
        nota word
    }
}

وضع التمرير — اختياري#

اختياري تُعلِّم معاملًا يمكن للمستدعي حذفه:

دالة connect(نص host, عدد port اختياري) → فراغ {
    اعرض host
}

Control flow#

التفرّع الشرطي#

إذا / وإلاإذا / وإلا#

بداية {
    ثابت _ condition ← صواب
    إذا condition {
        # truthy branch
        اعرض "matched"
    }
}

مع فروع else-if و else:

بداية {
    ثابت _ score ← 85
    إذا score ≥ 90 {
        اعرض "A"
    }
    وإلاإذا score ≥ 80 {
        اعرض "B"
    }
    وإلا {
        اعرض "C"
    }
}

التفرّع المُدمَج باستخدام إذن#

يستخدم جسم التفرّع ذو العبارة الواحدة إذن:

دالة classify(عدد b, منطقي ready, عدد value) → عدد ∪ نوع_لاشيء {
    إذا b ≡ 0 إذن أعد خال
    إذا ready إذن أعد value
    أعد خال
}

التكرار#

القيم — كرر من#

دالة inveni(قائمة<عدد> items, عدد target) → عدد ∪ نوع_لاشيء {
    كرر من items ثابت item {
        إذا item ≡ target إذن أعد item
    }
    أعد خال
}

المفاتيح — كرر عن#

بداية {
    ثابت جدول<نص, عدد> جدول ← { "unus": 1, "duo": 2 }
    كرر عن جدول ثابت key {
        اعرض key
    }
}

النطاق — كرر نطاق#

كرر نطاق 0‥10 ثابت i {
    اعرض i
}

حلقات طالما#

بداية {
    ثابت _ condition ← صواب
    طالما condition {
        # body
        صمت
    }
}

أقسام الحارس — احرس#

يُجمّع احرس فحوصات الخروج المُبكّر قبل جسم الدالة الرئيسي. كل عبارة إذا هي حارس تسلسلي:

دالة divide(عدد a, عدد b) → عدد {
    احرس {
        إذا b ≡ 0 {
            أعد 0
        }
    }
    أعد a / b
}

احرس غير قابل للكسر في الإصدار 1 — إنه سور حماية، وليس حلقة.

مطابقة الأنماط — اختر#

يختار اختر أول ذراع مُطابِق:

دالة describe(عدد value) → نص {
    اختر value {
        حالة 1 {
            أعد "one"
        }
        حالة 2 {
            أعد "two"
        }
        افتراضي {
            أعد "many"
        }
    }
}

مطابقة الاتحادات المُوسَمة — طابق#

يُطابِق طابق متغيرات تمايز بشكل شامل:

تمايز Exitus {
    Bonum {
        نص nuntius
    },
    Malum {
        نص causa
    }
}

دالة refer(Exitus eventus) → نص {
    طابق eventus {
        حالة Bonum ثابت nuntius {
            أعد nuntius
        }
        حالة Malum ثابت causa {
            أعد "Error: §"(causa)
        }
    }
}

كتل المحاولة — افعل / التقط#

يفتح افعل كتلة قد ترمي استثناءً، ويستردّ التقط السيطرة:

دالة divide(عدد a, عدد b) → عدد {
    أعد a / b
}

دالة tutus(عدد a, عدد b) → عدد {
    افعل {
        أعد divide(a, b)
    }
    التقط err {
        نبه err
        أعد 0
    }
}

Generics#

الدوال وأسماء الأنواع المستعارة وصنف وعقد تقبل وسائط النوع باستخدام الصيغة <T>.

الدوال العمومية#

دالة identitas<T>(T قيمة) → T {
    أعد قيمة
}

دالة primum<T>(قائمة<T> res) → T ∪ نوع_لاشيء {
    أعد res.الأول()
}

وسائط النوع الصريحة في موقع الاستدعاء#

دالة identitas<T>(T قيمة) → T {
    أعد قيمة
}

دالة primum<T>(قائمة<T> res) → T ∪ نوع_لاشيء {
    أعد خال
}

بداية {
    ثابت _ value ← identitas<عدد>(7)
    ثابت _ maybe ← primum<عدد>([value])
}

الأنواع العمومية#

صنف Par<T> {
    ثابت T primus
    ثابت T secundus
}

وسائط الحجم#

يُعلن حجم عن وسيط حجم/فهرس في قوائم الوسائط العمومية:

دالة crea<T, حجم N>() → موتر<T, [N]> {
    أعد فارغ
}