العرض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()  فراغ {
    أعد
}

الاستعارة وقابلية التعديل (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#

بداية {
    كرر نطاق 010 ثابت 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]> {
    أعد فارغ
}