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]> {
أعد فارغ
}