العرضar

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

يتوفر اختزال العرض في موضع النوع: i8u64، 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
    كرر نطاق 05 ثابت i {
        اعرض i
    }
    # inclusive range: 0, 1, 2, 3, 4, 5
    كرر نطاق 05 ثابت 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"