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() → فراغ {
أعد
}الاستعارة وقابلية التعديل (de, in, ex)#
يُحدد 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(ex textus buffer) → textus {
redde buffer
}
# Owned
functio salve(textus nomen) → textus {
redde "Salve, §!"(nomen)
}الكلمات نفسها (عن, من) تُعاد استخدامها في تراكيب أخرى — لا تقرأ كل من بمعنى "استهلاك":
| السياق | الدور |
|---|---|
de textus name على معامل | استعارة مشتركة |
in numerus count على معامل | استعارة قابلة للتعديل |
ex textus buffer على معامل | نقل إلى الدالة المستدعاة |
itera ex items fixum item | تكرار على القيم |
itera de tabula fixum key | تكرار على المفاتيح |
ex source fixum x, ceteri rest | تفكيك الحقول |
importa ex "path" | استيراد من وحدة |
نقطة الدخول#
نقطة دخول البرنامج هي بداية:
بداية {
اعرض "ingressus"
}نقطة دخول CLI#
بالنسبة لبرامج CLI، تستقبل incipit argumenta معاملات سطر الأوامر المُحلَّلة:
@ cli "echo"
@ descriptio "Prints text"
@ operandus ceteri textus words
incipit argumenta args {
itera ex args.words fixum word {
nota word
}
}وضع التمرير — sponte#
sponte تُعلِّم معاملًا يمكن للمستدعي حذفه:
دالة connect(نص host, عدد port اختياري) → فراغ {
اعرض host
}Control flow#
التفرّع الشرطي#
si / sin / secus#
بداية {
ثابت منطقي condition ← صواب
إذا condition {
# truthy branch
اعرض "matched"
}
}مع فروع else-if و else:
بداية {
ثابت عدد score ← 85
إذا score ≥ 90 {
اعرض "A"
}
وإلاإذا score ≥ 80 {
اعرض "B"
}
وإلا {
اعرض "C"
}
}التفرّع المُدمَج باستخدام ergo#
يستخدم جسم التفرّع ذو العبارة الواحدة ergo:
دالة classify(عدد b, منطقي ready, عدد value) → عدد ∪ لاشيء {
إذا b ≡ 0 إذن أعد لاشيء
إذا ready إذن أعد value
أعد لاشيء
}التكرار#
القيم — itera ex#
دالة inveni(قائمة<عدد> items, عدد target) → عدد ∪ لاشيء {
كرر من items ثابت item {
إذا item ≡ target إذن أعد item
}
أعد لاشيء
}المفاتيح — itera de#
بداية {
ثابت جسون tabula ← { "unus": 1, "duo": 2 }
كرر عن tabula ثابت key {
اعرض key
}
}النطاق — itera ab#
بداية {
كرر نطاق 0‥10 ثابت i {
اعرض i
}
}حلقات طالما#
بداية {
ثابت منطقي condition ← صواب
طالما condition {
# body
صمت
}
}أقسام الحارس — custodi#
يُجمّع custodi فحوصات الخروج المُبكّر قبل جسم الدالة الرئيسي.
كل عبارة إذا هي حارس تسلسلي:
دالة divide(عدد a, عدد b) → عدد {
احرس {
إذا b ≡ 0 {
أعد 0
}
}
أعد a / b
}custodi غير قابل للكسر في الإصدار 1 — إنه سور حماية، وليس حلقة.
مطابقة الأنماط — elige#
يختار اختر أول ذراع مُطابِق:
دالة describe(عدد value) → نص {
طابق value {
حالة 1 {
أعد "one"
}
حالة 2 {
أعد "two"
}
حالة _ {
أعد "many"
}
}
}مطابقة الاتحادات المُوسَمة — discerne#
يُطابِق طابق متغيرات discretio بشكل شامل:
تمايز Exitus {
Bonum {
نص nuntius
},
Malum {
نص causa
},
}
دالة refer(Exitus eventus) → نص {
طابق eventus {
حالة Bonum ثابت nuntius {
أعد nuntius
}
حالة Malum ثابت causa {
أعد "Error: §"(causa)
}
}
}كتل المحاولة — fac / cape#
يفتح افعل كتلة قد ترمي استثناءً، ويستردّ التقط السيطرة:
دالة divide(عدد a, عدد b) → عدد {
أعد a / b
}
دالة tutus(عدد a, عدد b) → عدد {
افعل {
أعد divide(a, b)
}
التقط err {
نبه err
أعد 0
}
}Generics#
الدوال وأسماء الأنواع المستعارة وصنف وimplendum تقبل وسائط النوع باستخدام الصيغة <T>.
الدوال العمومية#
دالة identitas<T>(T valor) → T {
أعد valor
}
دالة primum<T>(قائمة<T> res) → T ∪ لاشيء {
أعد res.primus()
}وسائط النوع الصريحة في موقع الاستدعاء#
دالة identitas<T>(T valor) → T {
أعد valor
}
دالة primum<T>(قائمة<T> res) → T ∪ لاشيء {
أعد لاشيء
}
ثابت عدد value ← identitas<عدد>(7)
ثابت عدد ∪ لاشيء maybe ← primum<عدد>([value])الأنواع العمومية#
صنف Par<T> {
T primus
T secundus
}وسائط الحجم#
يُعلن magnitudo عن وسيط حجم/فهرس في قوائم الوسائط العمومية:
دالة crea<T, حجم N>() → موتر<T, [N]> {
أعد فارغ
}