Types and values
Data types#
يمتلك Faber نظام أنواع ثابتاً، النوع أولاً. كل تصريح يضع النوع قبل الاسم: textus nomen، وليس nomen: textus. يغطي نظام الأنواع البدائيات القياسية، والمجموعات العامة، والأعداد محددة الحجم، والموترات، وأنواع السجلات الموجهة لوحدة معالجة الرسوميات.
الأنواع البدائية#
| النوع | الدور | مثال حرفي |
|---|---|---|
نص | سلسلة نصية يونيكود | "Salve, munde" |
ascii | رمز آلة ثابت | 'solum:lege' |
عدد | عدد صحيح بإشارة (الافتراضي i64) | 42 |
كسر | عدد عشري (الافتراضي f64) | 3.14 |
منطقي | قيمة منطقية | صواب، خطأ |
فراغ | وحدة / بلا قيمة | — |
لاشيء | معدوم / غائب | لاشيء |
لحظة | مدة / لحظة زمنية | — |
جسون | قيمة JSON وقت الترجمة | { "key": "value" } |
بايتات | تسلسل بايتات ست عشرية | \|00ff\| |
الأنواع العددية محددة الحجم#
يمتلك عدد وكسر عرضين افتراضيين (i64 وf64) وصيغاً ذات عرض صريح:
ثابت عدد<i32> narrow ← 7 ∷ عدد<i32>
ثابت عدد<u64> wide ← 255 ∷ عدد<u64>
ثابت f32 single ← 1.5 ∷ f32يتوفر اختزال العرض في موضع النوع: i8 … u64، f16، f32، f64 تكافئ numerus<W> / fractus<W>.
الأنواع القابلة للإعدام#
تستخدم القيم القابلة للإعدام صيغة الاتحاد T ∪ nihil:
دالة find(نص key) → عدد ∪ لاشيء {
أعد لاشيء
}
دالة maybe() → نص ∪ لاشيء {
أعد لاشيء
}لا توجد صيغة T? أو Option<T> في Faber. الاتحاد صريح.
أسماء الأنواع المستعارة#
نمط UserId = عددالأنواع العامة#
تقبل الدوال، وأسماء الأنواع المستعارة، وصنف، وimplendum معاملات نوع بصيغة <T>:
دالة identitas<T>(T valor) → T {
أعد valor
}
دالة primum<T>(قائمة<T> res) → T ∪ لاشيء {
أعد res.primus()
}تُدعم معاملات النوع الصريحة في موقع الاستدعاء:
دالة identitas<T>(T valor) → T {
أعد valor
}
ثابت عدد value ← identitas<عدد>(7)المجموعات#
| النوع | الدور | اختزال |
|---|---|---|
lista<T> | مجموعة ديناميكية مرتبة | lf32، lu32 |
tabula<K, V> | خريطة مفتاح-قيمة | — |
tensor<T, Figura> | حاوية كثيفة ثابتة الشكل | tf32[4]، ti64[2,3] |
sparsa<T, Figura> | حاوية متفرقة ثابتة الشكل | sf32[4]، si64[2,3] |
intervallum | نوع مجال | — |
copia<T> | مجموعة غير مرتبة | — |
cursor<T> | دفق كسول | — |
ثابت قائمة<عدد> nums ← [1, 2, 3]
ثابت جدول<نص, عدد> scores ← { "alice": 10, "bob": 20 }أنواع الموترات#
tensor<T, Figura> هو الحاوية الكثيفة ثابتة الشكل:
| الصيغة | المعنى |
|---|---|
tensor<T, Figura> | التهجئة القانونية |
tensor<T, []> | الرتبة 0 (حاوية قياسية) |
tensor<T, _> | فجوة استدلال الشكل |
tensor<T, [N]> | الرتبة 1 (متجه) |
tensor<T, [N, M]> | الرتبة 2 (مصفوفة) |
ثابت موتر<f32, []> scalar ← فارغ
ثابت موتر<عدد, [4]> vector ← [1, 2, 3, 4] ↦ موتر<عدد, [4]>
ثابت عدد ∪ لاشيء first ← vector[0]أنواع نواة وحدة معالجة الرسوميات#
يتعرف مسار الأنظمة على هذه الأنواع لأعمال وحدة معالجة الرسوميات والسجلات. ترفضها أهداف الحزمة التي تفتقر إلى دعم العتاد:
دالة half(f16 x) → f16 {
أعد x
}
دالة add(مصفوفة<f32, [2, 2]> a, مصفوفة<f32, [2, 2]> b) → مصفوفة<f32, [2, 2]> {
أعد a.addita(b)
}
دالة swap(ذري<عدد<i32>> cell, عدد<i32> value) → عدد<i32> {
أعد cell.exchange(value)
}علامات الاستعارة على الأنواع#
يمكن أن تظهر علامات الاستعارة (عن، في، من) على الأنواع في مواضع المعاملات للإشارة إلى كيفية تمرير القيمة:
# shared borrow — caller retains ownership
functio imprime(de textus label) → vacuum { }
# mutable borrow — caller lends mutable access
functio duplica(in numerus value) → vacuum { }
# move — caller gives up ownership
functio consume(ex textus buffer) → textus {
redde buffer
}سياسة المقارنة#
| المعامل | العائلة | السلوك |
|---|---|---|
≡، ≠ | مساواة تامة | تتطلب أنواعاً متطابقة؛ استثناء لاشيء |
≈، ≉ | مساواة قيمة عددية | الشبكة العددية فقط |
<، ≤، >، ≥ | ترتيب | عددي، لحظي، نص قياسي |
intra | احتواء مجال | عدد ضمن مجال |
inter | عضوية مجموعة | عنصر في مجموعة |
Variables and binding#
Faber تمتلك ثلاث كلمات مفتاحية للمتغيرات ورمز تخصيص مخصص. الفرق الأساسي
هو بين ثابت (كتابة مرة واحدة) و متغير (قابل لإعادة التخصيص بحرية)،
وبين ← (تدفق وقت التشغيل) و = (شكل الحقل الهيكلي).
fixum — ربط غير قابل للتغيير#
روابط ثابت تُكتب مرة واحدة. يمكن التصريح بها مع مهيئ أو بدونه؛ إذا تم
التصريح بدون مهيئ، يجب تخصيصها مرة واحدة بالضبط قبل القراءة. التخصيص
الثاني مرفوض.
ثابت عدد count ← 0
ثابت نص name ← "Marcus"
ثابت قائمة<عدد> inferred ← [1, 2, 3]التهيئة المؤجلة:
بداية {
ثابت عدد factor
إذا صواب {
factor ← 10
}
وإلا {
factor ← 100
}
اعرض factor
}varia — ربط قابل للتغيير#
روابط متغير قابلة لإعادة التخصيص بحرية:
بداية {
متغير عدد count ← 0
count ← count + 1
count ← count * 2
}sit — اختصار للربط غير القابل للتغيير مع استنتاج النوع#
sit هو اختصار لـ fixum _ — رابط غير قابل للتغيير مع نوع مستنتج:
بداية {
ثابت نص salve ← "Salve"
ثابت نص nomen ← "Marcus"
ثابت عدد x ← 42
# Deferred form
ثابت نص label
label ← "deferred"
}الربط وقت التشغيل مقابل التعريف الهيكلي#
Faber يفصل ما تدمجه معظم اللغات في =:
| الرمز | الدور | الاستخدام |
|---|---|---|
← | تدفق وقت التشغيل | الربط الأولي، إعادة التخصيص، التغيير |
= | الشكل الهيكلي | أسماء الحقول داخل القيم الحرفية والبيانات الوصفية |
صنف Point {
عدد x
عدد y
}
بداية {
# Runtime: ← attaches a value to a name at execution time
متغير عدد count ← 0
متغير نص label ← "ready"
count ← count + 1
# Structural: = defines field values inside a type literal
ثابت Point p ← Point {x = 10, y = 20}
}استخراج الحقول باستخدام ex#
من يستخرج الحقول من قيمة إلى روابط محلية:
صنف Persona {
نص nomen
عدد aetas
}
بداية {
ثابت Persona p ← Persona {nomen = "Marcus", aetas = 30}
ثابت نص nomen ← p.nomen
ثابت عدد aetas ← p.aetas
# prints "Marcus"
اعرض nomen
}الزيادة والنقصان اللاحقة#
⊕ و ⊖ هما عبارتا زيادة ونقصان لاحقة للأماكن عدد القابلة
للتغيير. هما عبارات فقط — لا قيمة تعبيرية، ولا أشكال بادئة:
بداية {
متغير عدد i ← 0
# i becomes 1
i ⊕
# i becomes 0
i ⊖
}Collections#
لدى Faber عدة أنواع مجموعات مملوكة للمترجم. طرائقها القانونية موجودة في المترجم، وليس في المكتبة القياسية.
Lista — مجموعة ديناميكية مرتبة#
ثابت قائمة<عدد> empty ← فارغ
ثابت قائمة<عدد> numbers ← [1, 2, 3, 4, 5]
ثابت قائمة<نص> names ← ["Marcus", "Julia", "Gaius"]
ثابت قائمة<قائمة<عدد>> nested ← [[1, 2], [3, 4]]النشر باستخدام sparge:
ثابت قائمة<عدد> a ← [1, 2, 3]
ثابت قائمة<عدد> b ← [4, 5, 6]
ثابت قائمة<عدد> combined ← [انشر a, انشر b]
ثابت قائمة<عدد> headed ← [0, انشر a, 99]الطرائق الرئيسية: longitudo، accipe، appende، summa، primus، novissimus.
Tabula — خريطة مفتاح-قيمة#
ثابت جدول<نص, عدد> scores ← { "alice": 10, "bob": 20 }Tensor — مصفوفة كثيفة ثابتة الشكل#
ثابت موتر<f32, []> scalar ← فارغ
ثابت موتر<عدد, [4]> vector ← [1, 2, 3, 4] ↦ موتر<عدد, [4]>
ثابت عدد ∪ لاشيء first ← vector[0]تبسيط Tensor (للأكواد ذات الحسابات العددية الكثيفة):
ثابت موتر<f32, []> seed ← فارغ
ثابت موتر<f32, [4]> lanes ← seed.strue([1.0, 2.0, 3.0, 4.0], [4])الطرائق الرئيسية: forma، accipe، ponde، crea، structa، strue،
بالإضافة إلى الحساب العنصري، وضرب المصفوفات (multiplicatio)،
والاختزالات (summa، productum).
Sparsa — مصفوفة متفرقة ثابتة الشكل#
ثابت متفرقة<f32, [2, 3]> sparse ← فارغ
بداية {
sparse.ponde([0, 1], 4.0)
sparse.ponde([1, 2], 9.0)
# accipe returns the stored value, here 4.0
اعرض sparse.accipe([0, 1])
# count of stored entries
اعرض sparse.nonnihil()
}التحويل بين الكثيف والمتفرق:
ثابت موتر<f32, [2, 2]> dense ← [[1.0, 0.0], [0.0, 2.0]] ↦ موتر<f32, [2, 2]>
ثابت متفرقة<f32, [2, 2]> sparse ← dense ↦ متفرقة<f32, [2, 2]>
ثابت موتر<f32, [2, 2]> roundtrip ← sparse ↦ موتر<f32, [2, 2]>Cursors — تيارات كسولة#
cursor<T> هو نوع تيار كسول. يُنشأ من مكررات المجموعات،
أو مناظير tuus، أو دوال مولدة. يُستهلك عبر itera ex:
ثابت قائمة<عدد> items ← [1, 2, 3]
بداية {
كرر من items ثابت item {
اعرض item
}
}Intervallum — نطاقات#
بداية {
# exclusive range: 0, 1, 2, 3, 4
كرر نطاق 0‥5 ثابت i {
اعرض i
}
# inclusive range: 0, 1, 2, 3, 4, 5
كرر نطاق 0…5 ثابت i {
اعرض i
}
}‥ هو حد نطاق حصري؛ … هو حد شامل.
String and template literals#
تستخدم Faber دلالات المحددات — كل صيغة اقتباس تعني شكل مصدر مختلف. وهي ليست مرادفات قابلة للتبادل.
الصيغ الحرفية#
| الصيغة | النوع | الدور | ||
|---|---|---|---|---|
'…' | ascii | رموز آلية ثابتة؛ لا §؛ لا (…) | ||
"…" | نص | سلاسل يونيكود نصية قصيرة؛ (…) يُنتِج | ||
«…» | نص | يونيكود كتلي/متعدد الأسطر؛ (…) يُنتِج | ||
… | forma | قوالب مأسورة؛ (…) يأسر | ||
{ … } | جسون | وثيقة JSON في زمن الترجمة | ||
| ` | … | ` | بايتات | بايتات سداسية عشرية في زمن الترجمة |
[ … ] | lista<T> | قيمة حرفية من نوع قائمة Faber |
تطبيق قالب السلسلة النصية#
تُنسّق Faber النص عبر تطبيق قالب السلسلة النصية: قيمة حرفية "…" أو «…»
تحتوي ثقوب §، ثم وسيطات بين قوسين:
دالة greet(نص nomen) → نص {
أعد "Salve, §!"(nomen)
}
ثابت عدد pagina ← 3
ثابت عدد totum ← 10
ثابت نص code ← "200"
ثابت نص label ← "OK"
ثابت نص msg ← "Page § of §"(pagina, totum)
ثابت نص block ← "status: § (§)"(code, label)القواعد الأساسية:
§(U+00A7) هو ثقب القالب- الثقوب الموضعية:
§0،§1، … للترتيب الصريح - اللاحقة
!تختار تنسيق العرض:"Salve, §!"(nomen) - ملحقة
(وسائط)هي تطبيق قالب، وليس استدعاء دالة
السلاسل النصية الكتلية#
تستخدم الكتل متعددة الأسطر علامات التنصيص المزدوجة «…»:
ثابت نص sql ← «
select id, email
from accounts
»القوالب المأسورة (forma)#
تأسر قوالب الفاصلة العليا المائلة النص والوسائط دون إنتاج. آمنة للحمولات المقيّدة SQL/URL:
ثابت عدد user_id ← 42
ثابت forma query ← `select * from users where id = §`(user_id)JSON المُضمّن#
الصيغة المجردة { … } هي JSON مُضمّن: وثيقة جسون في زمن الترجمة، وليست
كائن Faber مجهول. المفاتيح هي سلاسل نصية بين علامتي تنصيص مفصولة بـ ::
ثابت جسون empty ← {}
ثابت جسون user ← { "name": "Marcus", "age": 30, "active": true }
ثابت جسون nested ← { "meta": { "version": 1 }, "tags": ["alpha", "beta"] }لبناء genus مُنمّط، استخدم اسم النوع وشكل الحقل =:
صنف Point {
عدد x
عدد y
}
ثابت Point p ← Point {x = 10, y = 20}Nullability and optionality#
تُميِّز Faber بين غياب القيمة وتوفيرها الاختياري في موقع الإعلان.
القيم القابلة للعدم — T ∪ nihil#
استخدِم T ∪ nihil عندما يمكن أن تكون القيمة غائبة:
دالة find(نص key) → عدد ∪ لاشيء {
أعد لاشيء
}
دالة divide(عدد a, عدد b) → عدد ∪ لاشيء {
إذا b ≡ 0 إذن أعد لاشيء
أعد a / b
}فتحات الإعلان الاختيارية — sponte#
استخدِم sponte بعد الاسم عندما يمكن للمُستدعي أو المنشئ حذف مُعامل أو حقل:
دالة connect(نص host, عدد port اختياري) → فراغ {
}
صنف User {
نص email اختياري
}يمكن دمج علامات الاستعارة مع المُعاملات الاختيارية:
دالة process(عن عدد depth اختياري) → فراغ {
}تأكيد عدم العدم — !#
استخدِم !. و ![ و !( لتأكيد أن القيمة القابلة للعدم ليست لاشيء:
صنف Box {
عدد ∪ لاشيء val
}
ثابت Box ∪ لاشيء maybe_name ← Box {val = 7}
ثابت عدد ∪ لاشيء name ← maybe_name!.valيؤدي تأكيد عدم العدم على لاشيء إلى إجهاض التنفيذ وقت التشغيل.
الدمج العدمي — vel#
ثابت نص ∪ لاشيء provided ← لاشيء
ثابت نص name ← provided عوض "default"ignotum#
ignotum هو النوع غير المعروف عالي المستوى لمخارج الطوارئ والمعرفة غير
المكتملة. وهو ليس آليةً للتعامل مع العدم.
Conversion and construction#
عاملَا تحويل مهمّان: أحدهما لوقت التشغيل والآخر لوقت الترجمة:
# runtime conversion
ثابت عدد parsed ← "42" ↦ عدد
# static ascription
ثابت عدد value ← 7
ثابت نص text ← value ∷ نصالتحويل وقت التشغيل — ↦#
استعمل ↦ للتحويل وقت التشغيل، خصوصًا التحليل أو الإكراه الذي قد يفشل.
وفّر استردادًا مضمنًا باستعمال ⇥:
ثابت نص input ← "9"
ثابت عدد n ← "42" ↦ عدد
ثابت عدد safe ← input ↦ عدد ⇥ 0تجسيد موجّه بالنوع:
ثابت نص path ← "/etc/hosts"
ثابت متجه<f32, 4> lanes ← [1.0, 2.0, 3.0, 4.0] ↦ متجه<f32, 4>
ثابت نص body ← اتصل 'solum:lege' (path) ↦ نصالإسناد الثابت — ∷#
استعمل ∷ للإسناد الثابت الصريح للنوع. هو لاحق وموجّه بالنوع الهدف:
ثابت عدد value ← 7
ثابت عدد<i32> x ← 7 ∷ عدد<i32>
ثابت نص text ← value ∷ نصالدمج العدمي — vel#
استعمل vel للدمج العدمي حينما تكون القيمة لاشيء:
ثابت نص ∪ لاشيء provided_name ← لاشيء
ثابت نص name ← provided_name عوض "default"