العرضar

Grammar

القواعد الشكلية للغة البرمجة Faber. التنفيذ النشط هو مساحة عمل Rust الجذرية: crates/faber لأدوات الحزم والمشاريع و crates/radix لخط أنابيب المصرّف.

---

بنية البرنامج#

ملفات Faber المصدرية هي نصوص خام تقشّر بواسطة المشغّل قبل التحليل المعجمي. الواجهة الأمامية TOML الاختيارية ليست جزءاً من قواعد الرموز.

fabFile       := frontmatter? program
frontmatter   := '+++' NEWLINE tomlBody NEWLINE '+++' NEWLINE?
program       := statement*
statement     := importDecl | varDecl | funcDecl | genusDecl | implendumDecl
               | typeAliasDecl | enumDecl | discretioDecl
               | ifStmt | whileStmt | iteraStmt
               | eligeStmt | discerneStmt | guardStmt | curaStmt | facBlockStmt
               | returnStmt | breakStmt | continueStmt | noopStmt | throwStmt
               | assertStmt | outputStmt | adStmt | incipitStmt
               | incipietStmt | extractStmt
               | probandumDecl | probaStmt | blockStmt | incDecStmt | exprStmt
blockStmt     := '{' statement* '}'

الواجهة الأمامية للملف (+++)#

عند وجودها، يجب أن تفتح الواجهة الأمامية في السطر 1 بـ +++ بالضبط. سطر لاحق يُقلّم إلى +++ بالضبط ينهي الكتلة. البايتات بعد المحدد الختامي هي program الخاص بـ Faber. الجسم الفارغ (مسافات بيضاء فقط) هو برنامج فارغ صالح.

تُحلّل الواجهة الأمامية كمستند TOML عام في مشغّل المصرّف — لا تُحلّل كعبارات Faber. يمكن للمؤلفين إرفاق مفاتيح بيانات وصفية اعتباطية؛ تقرأ الأدوات المفاتيح المعروفة مثل group و sectio و [probanda] عبر دوال الوصول. أدوات حزمة faber تستهلك مفاتيح الحزمة تلك. سلطة الحزمة لـ [package] و [paths] و [build] تبقى في faber.toml؛ قيم الواجهة الأمامية المتعارضة تُرفض في وضع الحزمة.

مثال:

+++
group = "exempla.directiva"
sectio = "smoke"
+++

بداية {}

توجيهات الملف § في بداية السطر أُزيلت. ضع بيانات الملف الوصفية في الواجهة الأمامية +++ بدلاً من ذلك. داخل السلاسل المقتبسة، يبقى § كثقب قالب السلسلة (انظر الاستدعاء والوصول إلى الأعضاء أدناه).

---

التصريحات#

المتغيرات#

varDecl      := ('ثابت' | 'متغير') typeAnnotation IDENTIFIER (('←' expression) | ('↤' assignment inlineRecovery?))?
sitDecl      := 'ليكن' IDENTIFIER ('←' expression)?
arrayDestruct := ('ثابت' | 'متغير') arrayPattern '←' expression
objectDestruct := ('ثابت' | 'متغير') objectPattern '←' expression
  • ثابت = ارتباط غير قابل للتغيير (كتابة مرة واحدة): يمكن التصريح به دون مهيئ وإسناده مرة واحدة بالضبط لاحقاً، ثم يتجمد. متغير = ارتباط قابل للتغيير (قابل لإعادة الإسناد)، مثل let.
  • استخدم _ كتوصيف نوع عندما يحدد المهيئ النوع: ثابت _ name ← value
  • ليكن name ← value هو اختزال لـ ثابت _ name ← value (محلي غير قابل للتغيير مستنتج)
  • ليكن name (بدون مهيئ) هو اختزال لـ ثابت _ name — غير القابل للتغيير المؤجل المستنتج. أسند مرة واحدة بالضبط قبل أي قراءة.
  • التهيئة المؤجلة: ثابت numerus x أو ليكن x يصرح عن خانة غير قابلة للتغيير غير مهيأة يجب إسنادها مرة واحدة بالضبط قبل أي قراءة؛ الإسناد الثاني مرفوض. تمرير الإسناد المحدد (المرحلة الدلالية 3أ) يفرض هذا.

الدوال#

funcDecl     := 'دالة' IDENTIFIER genericParams? '(' paramList ')' funcModifier* returnClause? alternateExitClause? blockStmt?
paramList    := (parameter (',' parameter)*)?
genericParams := '<' genericParam (',' genericParam)* '>'
genericParam  := IDENTIFIER | 'حجم' IDENTIFIER
typeArgs      := '<' typeAnnotation (',' typeAnnotation)* '>'
parameter    := ('عن' | 'في' | 'من')? 'باقي'? typeAnnotation IDENTIFIER 'اختياري'? ('كـ' IDENTIFIER)? ('عوض' expression)?
funcModifier := 'وسائط' IDENTIFIER | 'مخصص' IDENTIFIER ('كـ' IDENTIFIER)? | 'مخطئ' IDENTIFIER | 'مخرج' (IDENTIFIER | NUMBER) | 'ثابتة' | 'يرمي' | 'خيارات' IDENTIFIER
returnClause := '→' typeAnnotation
alternateExitClause := '⇥' typeAnnotation
stmtBodyJoint  := 'إذن'
clausuraJoint  := '∴'
clausuraExpr   := compactClausuraExpr | legacyClausuraExpr
compactClausuraExpr := clausuraSignature clausuraJoint (expression | closureFacBlock)
clausuraSignature := (clausuraParam | '(' clausuraParams? ')') returnClause? alternateExitClause?
closureFacBlock := 'افعل' blockStmt catchClause?
legacyClausuraExpr := 'إغلاق' clausuraParams? ('→' typeAnnotation)? (':' expression | blockStmt)
clausuraParams := clausuraParam (',' clausuraParam)*
clausuraParam  := typeAnnotation IDENTIFIER
  • صيغة الإرجاع: يصرح عن نوع النجاح العادي. الدالة ذات الجسم بدون هي تأثير فقط (فراغ) ويجب ألا تحتوي على أعد. الإغلاق ذو الجسم العباري (افعل { ... } أو جسم الكتلة القديم) يجب أيضاً أن يكتب → T قبل أن يتمكن من استخدام أعد؛ الإغلاقات ذات جسم التعبير قد تستنتج نتيجتها من التعبير.
  • صيغة الخروج البديل القابل للاسترداد: يصرح عن نوع قناة الخطأ. يمكن أن يظهر بعد → T أو وحده على دالة قابلة للفشل تأثير فقط أو إغلاق. جسم الإغلاق الذي يستخدم ارم هارباً يجب أن يصرح عن ⇥ E الخاص به؛ لا يمكنه وراثة قناة خطأ الدالة المحيطة. افعل { ... } التقط err { ... } محلي قد يلتقط ارم بدون محيط. استدعاء دالة قابل للفشل (→ T ⇥ E) داخل دالة مصرحة بـ ينتشر إلى الخروج البديل للدالة بدون غلاف افعل/التقط، معاكساً كيف يتصرف conversio المجرد و ارم الرمي بالفعل؛ يخفض الاستدعاء إلى ? الخاص بـ Rust. يجب على الإغلاق أن يصرح عن الخاص به لنشر استدعاء قابل للفشل — قناة خطأ الدالة المحيطة لا تعبر حدود الإغلاق.
  • بادئات المعامل: عن (قراءة)، في (تعديل)، من (استهلاك)
  • علامة بعد الاسم: اختياري (توفير طوعي/اختياري)
  • باقي يعلم معامل الباقي
  • مخصص NAME ('كـ' LOCAL)? يصرح عن متطلب مخصص؛ LOCAL هو الاسم المستعار في جسم الدالة
  • إذن هو رابط جسم العبارة المدمج فقط (أذرع إذا/طالما/حالة/… ذات العبارة الواحدة).
  • هو رابط الإغلاق المدمج فقط. الاثنان ليسا مترادفين.
  • أجسام كتلة الإغلاق المدمجة يجب أن تستخدم افعل { ... }؛ جسم افعل المحلي للإغلاق قد يرفق التقط، لكن لا يمكنه استخدام طالما اللاحق.

الأصناف#

genusDecl    := 'مجرد'? 'صنف' IDENTIFIER typeParams? ('امتد' IDENTIFIER)? ('حقق' IDENTIFIER (',' IDENTIFIER)*)? '{' genusMember* '}'
genusMember  := annotation* (fieldDecl | methodDecl)
fieldDecl    := 'سكوني'? 'مرتبط'? typeAnnotation IDENTIFIER 'اختياري'? ('=' expression)?
methodDecl   := 'دالة' IDENTIFIER '(' paramList ')' funcModifier* returnClause? alternateExitClause? blockStmt?

التعليقات#

annotation            := '@' annotationName annotationBody?
annotationName        := IDENTIFIER | 'عام' | 'محمي' | 'خاص' | 'مستقبلي' | 'مؤشر'
                        | 'وسم' | 'فقط' | 'أهمل' | 'قس'
annotationBody        := bracedAnnotation | annotationArgs
bracedAnnotation      := '{' annotationFieldList? '}'
annotationFieldList   := annotationField (',' annotationField)* ','?
annotationField       := IDENTIFIER '=' (expression | typeAnnotation)

cliProgramAnnotation := '@' 'cli' STRING
imperiumAnnotation := '@' 'imperium' STRING
optioAnnotation    := '@' 'optio' IDENTIFIER optioModifier*
optioModifier      := 'brevis' STRING | 'longum' STRING | 'نمط' typeAnnotation
                    | 'descriptio' STRING | 'ubique' | 'عوض' expression
operandusAnnotation := '@' 'operandus' ('باقي')? typeAnnotation IDENTIFIER operandusModifier*
operandusModifier  := 'descriptio' STRING | 'ubique' | 'عوض' expression
annotationArgs     := (STRING | IDENTIFIER | expression)+

(* عقود التعليقات — مخططات بيانات وصفية زمن التصريف *)
annotatioMarker     := '@' 'annotatio' ( '{' annotatioFieldList? '}' )?
annotatioFieldList  := annotatioField (',' annotatioField)* ','?
annotatioField      := 'target' '=' annotatioTarget
annotatioTarget     := 'دالة' | STRING | IDENTIFIER
contractApplication := '@' IDENTIFIER ( '{' annotationFieldList? '}' )?

jsonGenusAnnotation := '@' 'json'
jsonFieldAnnotation := '@' 'json' '{' 'nomen' '=' STRING '}'

Radix يحلل سجلات التعليقات المحصورة (@ مستقبلي { }، @ optio { binding = verbose, ... }) والتهجئات المختزلة الموجودة. تهبط الصيغ المختزلة والمحصورة إلى نفس سجلات HirAnnotation للعائلات المرقّاة. بعض عائلات الرموز غير المرقّاة قد تظل تحافظ على وسائط التعليقات الخام حتى يُهاجر مستهلكوها.

عقود التعليقات: @ annotatio (اختيارياً @ annotatio { target = دالة }) يعلم صنف مستوى أعلى كعقد تعليق زمن التصريف. الأصناف العادية ليست مخططات تعليق. التطبيقات تستخدم @ ContractName { field = constant } وتحل من خلال التصريحات المحلية أو صادرات واجهة الملف المستوردة. التطبيقات المحلولة تهبط إلى HirAnnotation مع contract_id: Some(DefId) وقيم حقول ثابتة. هدف الإرفاق v1 هو دالة فقط؛ كميات الحمولة هي نص، عدد، كسر، و منطقي (اختيارية عبر اختياري أو T ∪ لاشيء). لا توجد عائلات @ web / controller / route مملوكة للمصرّف.

أصناف JSON: @ json على صنف هو عقد نموذج بيانات مملوك للمصرّف، وليس مخطط تعليق عام. يجب أن تكون الحقول آمنة لـ JSON (نص، أسكي، عدد، كسر، منطقي، لحظة، لاشيء، قائمة<T>، جدول<نص, T>، قابل للإبطال T ∪ لاشيء، أو @ json صنف آخر). البيانات الوصفية للحقل @ json { nomen = "wire_name" } تغير مفتاح الكائن المنبعث المستخدم بواسطة value ↦ قيمة، value ↦ جسون، و جسون ↦ Genus؛ نص JSON يبقى عملية Norma سلكية مثل json.pange(value ↦ جسون).

  • @ radix محجوز للبيانات الوصفية المملوكة للمصرّف. المعنى التاريخي لجذع الصرف متقاعد؛ الصرف يبقى تخصص تسمية مصدري، وليس تصريفاً مولّداً من المصرّف. صيغ التوجيه المقبولة هي @ radix lane "air" / "mir" / "hir-direct" على دوال المستوى الأعلى لتوجيه مسار المصرّف الصريح؛ تركيبات المسار/الهدف غير المدعومة تُرفض بتشخيصات بدلاً من تجاهلها.
  • @ verte يعرّف تحويل توليد الكود (اسم طريقة أو قالب)
  • @ nondum [TARGET] ["REASON"] يعلم تصريحاً كموجود في واجهة لكن غير متاح للهدف
  • @ cli "NAME" يعلم مدخل بداية كبرنامج CLI
  • @ imperium "NAME" يعلم دالة كنقطة دخول أمر CLI
  • @ optio NAME ... يعرّف خيار CLI؛ استخدم نمط منطقي للأعلام المنطقية
  • @ operandus [باقي] TYPE NAME ... يعرّف وسيطاً موضعياً لـ CLI
  • @ مستقبلي يعلم دالة كغير متزامنة
  • @ مؤشر يعلم دالة كمولّد
  • @ عام و @ خاص تُحللان كتعليقات لكن لا تُفرضان؛ المصرّف يصدر WARN012 (رؤية تزيينية) حتى لا يُضلل المؤلفون بتوقع تحكم بالوصول
  • @ محمي محجوز ومرفوض بتشخيص دلالي؛ ليس له معنى رؤية حزمة أو صنف فرعي أو ملف شقيق
  • امتد = يمتد، حقق = يحقق
  • سكوني = static، مرتبط = bound/property

الواجهات#

implendumDecl   := 'عقد' IDENTIFIER typeParams? '{' implendumMethod* '}'
implendumMethod := annotation* 'دالة' IDENTIFIER '(' paramList ')' funcModifier* returnClause? alternateExitClause?

عقد هو بناء العقد: طرق بتوقيع فقط لـ حقق (صيغة المصدر المؤنث من implere — ما يجب تحقيقه). فضاءات أسماء الاستيراد هي حدود ملف .fab؛ التصريحات المصدرة تعيش في المستوى الأعلى للملف.

أسماء الأنواع المستعارة#

typeAliasDecl := 'نمط' IDENTIFIER genericParams? '=' typeAnnotation

التعدادات#

enumDecl   := 'ترتيب' IDENTIFIER '{' enumMember (',' enumMember)* ','? '}'
enumMember := IDENTIFIER ('=' ('-'? NUMBER | STRING))?

الاتحادات الموسومة#

discretioDecl := 'تمايز' IDENTIFIER typeParams? '{' variant (',' variant)* ','? '}'
variant       := IDENTIFIER ('{' variantFields '}')?
variantFields := (typeAnnotation IDENTIFIER (',' typeAnnotation IDENTIFIER)*)?

تسمية المعرفات#

أسماء الحالة المختلطة ذات الأحرف الأولى الصغيرة مقبولة نحوياً لكنها غير مفضلة في Faber للغة أو المكتبة القياسية أو مسارات المضيف أو واجهات API الجوهرية المملوكة للمصرّف. فضّل كلمة واحدة. إذا لم تستطع كلمة واحدة حمل المعنى، استخدم snake_case فقط في حالات نادرة. إذا لم ينجح أي شكل، فالطريقة على الأرجح لا تنتمي للسطح الأساسي ما لم تكن حرجة. تشفير/فك تشفير المكتبة القياسية يستخدم ثلاثي الأفعال الميكانيكية pange / solve / tempta عبر الوحدات — انظر docs/stdlib/stdlib-mechanical-verbs.md. مكتبة النصوص العامة هي norma:chorda — انظر docs/stdlib/chorda-methods.md.

الاستيرادات#

importDecl     := importRecord | importSugar
importRecord   := 'استورد' '{' importFieldList? '}'
importFieldList := importField (',' importField)* ','?
importField    := importSourceField | importVisibilityField | importNameField
                | importAliasField | importWildcardField
importSourceField := 'من' '=' STRING
importVisibilityField := 'visibilitas' '=' visibility
importNameField := 'nomen' '=' IDENTIFIER
importAliasField := 'كـ' '=' IDENTIFIER
importWildcardField := 'جميع' '=' IDENTIFIER

importSugar    := 'استورد' 'من' STRING visibility? (namedImport | wildcardImport)?
visibility    := 'خاص' | 'عام'
namedImport   := IDENTIFIER ('كـ' IDENTIFIER)?
wildcardImport := '*' 'كـ' IDENTIFIER

مثال:

استورد من "hono" خاص Hono
استورد من "hono" خاص Context
استورد من "norma:chorda"                         # defaults to خاص chorda
استورد { من = "norma:json/solve", كـ = solve_mod }
استورد من "norma:consolum" خاص consolum
استورد من "faber:*" خاص faber              # kernel manifest glob
استورد من "lodash" خاص * كـ _
استورد من "./types" عام User               # re-export

غياب الرؤية يفترض خاص. غياب الربط المسمى يفترض آخر مقطع من مسار الاستيراد عندما يكون معرفاً صالحاً غير متعارض. إذا كان الاسم المستنتج غير صالح أو يتصادم مع ربط موجود في المستوى الأعلى، اكتب ربط nomen أو كـ صريحاً.

استورد من "faber:*" خاص faber هو اختزال خاص بالنواة: النجمة تعيش داخل سلسلة مسار الاستيراد وتوسع بيان النواة للإصدارة الثنائية إلى استدعاءات faber.<module>.<verb>. إنه ليس صيغة خاص * كـ name بحرف البدل ولا ينشئ قيمة تجميعية زمن التشغيل.

---

الأنواع#

typeAnnotation := ('عن' | 'في')? baseType ( '∪' typeAnnotation )*
baseType       := holeType | functionType | qualifiedType typeParams? | '(' typeAnnotation ')'
holeType       := '_' | '∪'
qualifiedType  := IDENTIFIER ('.' IDENTIFIER)*
functionType   := '(' typeList? ')' '→' typeAnnotation alternateExitClause?
typeList       := typeAnnotation (',' typeAnnotation)*
typeParams     := genericParams
  • المصفوفات تُكتب قائمة<T>. اللاحق T[] غير مقبول.
  • عن/في يعلمان الملكية (استعارة/استعارة-متغيرة) كبادئات على النوع.
  • الاتحاد المضمن T ∪ U (كأس) لاتحادات القيم المخصصة؛ T ∪ لاشيء هو صيغة النوع القابل للإبطال القانونية (تخفض إلى Option<T>).
  • الاتحادات ترابطية يميناً في القواعد لكن تُحلل بشكل مسطح؛ التكرارات وحالات لاشيء فقط تُشخّص في التخفيض الدلالي.
  • اختياري هو علامة تصريح (بعد الاسم على المعاملات/الحقول)، ليس بادئة على الأنواع أبداً.
  • مسارات الأنواع المؤهلة مثل terminus.Terminus تسمي نوعاً من خلال ربط فضاء أسماء مستورد. يجب أن تحل البادئة إلى فضاء أسماء؛ يجب أن يحل المقطع الأخير إلى تصريح حامل للنوع.

أنواع الدوال تمكّن توقيعات الدوال ذات الرتبة الأعلى:

دالة filtrata((T) → منطقي pred) → قائمة<T>
دالة compose((A) → B f, (B) → C g) → (A) → C
دالة apply((عدد) → عدد ⇥ نص op, عدد n) → عدد ⇥ نص

الأنواع الأولية#

Faberالمعنى
نصسلسلة Unicode
أسكيسلسلة ASCII فقط
formaقالب ملتقط + معاملات
عددعدد صحيح (افتراضي i64)
حلقة<W>كلمة حلقية غير موقعة؛ الحساب يلتف بقياس 2^W
كسرعدد كسري (افتراضي f64)
منطقيمنطقي
لاشيءnull
فراغvoid
أبداnever
مجهولunknown
بايتاتbytes

الأوليات المقاسة تقبل علامة عرض اختيارية واحدة (وليس معامل نوع مستخدم):

العائلةالعلاماتمثال غير صالح
عدد<W>i8, i16, i32, i64, u8, u16, u32, u64عدد<f32> → استخدم كسر<f32>
كسر<W>f16, f32, f64كسر<i32> → استخدم عدد<i32>؛ bf16 مؤجل
حلقة<W>u8, u16, u32, u64حلقة<i32> → العروض الموقعة ليست كلمات حلقية

عدد / كسر المجردان يبقيان اختزالاً لـ عدد<i64> / كسر<f64>.

حلقة<W> هو عائلة دلالية متميزة: الحساب لا يمتزج ضمنياً مع عدد<W>، بينما يبقى التحويل الصريح بنفس العرض متاحاً. يجب أن تكون الحرفيات في 0..=2^W-1 (لـ حلقة<u64> حتى 18446744073709551615). تعدادات الإزاحة هي نفسها حلقية: x ⇐ W هو التفاف كامل. الحساب الحلقي عبر العروض مرفوض.

المجموعات العامة#

Faberالمعنى
قائمة<T>مصفوفة
جدول<K,V>خريطة
مجموعة<T>مجموعة
وعد<T>وعد
مؤشر<T>مكرر
tensor<T, Figura>مخزن مؤقت كثيف متجانس بشكل ساكن Figura؛ الطرق العددية تتطلب أنواع عناصر عددية
vector<T, N>متجه عددي فئة-سجل بعرض ساكن N (بعد واحد، ليس مدعوماً بمخزن مؤقت)
matrix<T, [R, C]>مصفوفة عددية فئة-سجل ببعدين ساكنين بالضبط (ليست مدعومة بمخزن مؤقت وليست اسماً مستعاراً لـ tensor)
atomic<T>خلية ذرية حساسة للتخزين؛ v1 تقبل عناصر i32 / u32 فقط ويجب أن يمر الوصول عبر طرق ذرية
sparsa<T, Figura>مخزن مؤقت متفرق متجانس بشكل ساكن Figura؛ الإحداثيات المحذوفة تساوي صفراً؛ الطرق العددية تتطلب أنواع عناصر عددية

Figura := _ | natural | ident | [ figura-list ] ([] الفارغ هو رتبة-0). tensor<T> المجرد غير مكتمل — استخدم tensor<T, []> للرتبة-0 أو tensor<T, _> لاستنتاج الشكل.

فارغ لـ tensor<T, []> ينتج موتر رتبة-0 (فتحة عنصر واحدة مهيأة افتراضياً). فارغ لـ sparsa<T, Figura> (أي شكل) ينتج موتراً متفرقاً كله أصفار بدون مدخلات مخزنة. matrix<T, Figura> يتطلب بعدين بالضبط؛ matrix<T> المجرد وأشكال المصفوفة ذات محور واحد أو ثلاثة مرفوضة. atomic<T> يتطلب أن يكون T إما i32 أو u32 في v1. الخلايا الذرية غير قابلة للتبادل مع نوع عنصرها؛ استخدم طرق المستقبل load و store و exchange و compare_exchange. أنشئ الموترات متعددة الأبعاد عبر crea / structa / . Type(...) ليست صيغة إنشاء: vector<f32, 4>(...)، matrix<f32, [2, 2]>(...)، tensor<f32, [2, 2]>(...)، والصيغ العددية مثل عدد("42") مرفوضة. استخدم value ↦ Type، أو دوال المكتبة المسماة، أو سجلات Genus { field = value }.

فتحات المؤشر/الشكل الجوهرية للموتر (accipe، ponde، forma، crea، structa) تقبل قوائم أعداد صحيحة تناسب حد زمن التشغيل القانوني قائمة<عدد> / &[i64] في مواقع الاستدعاء (مثلاً قائمة<u32> لمعرفات خيوط GPU؛ وليس قائمة<u64>). هذا استثناء بنيوي محصور بتلك الفتحات — لا يوسع شبيكة الأعداد الموقعة↔غير الموقعة (انظر سياسة معامل متجه الفهرس في tensor-intrinsics.md).

اتحادات القيم تستخدم T ∪ U المضمن (قابل للإبطال: T ∪ لاشيء). الاتحادات الموسومة تستخدم تمايز. مجموعة.unio() هي طريقة مجموعة، وليس بناء نوع.

اختزال الأنواع#

اختزال الأنواع هو تهجئة بديلة للأنواع العددية وأنواع المجموعات. هو في موضع النوع فقط و متطابق دلالياً مع الصيغة الطويلة — يعامل المصرّف كلتيهما بنفس الطريقة. هذا هو المرجع القانوني الوحيد للاختزال؛ بقية المواصفات تستخدم الصيغة الطويلة.

يجمع الاختزال علامة عرض مع بادئة عائلة اختيارية من حرف واحد. علامات العرض هي i8/i16/i32/i64 (موقعة)، u8/u16/u32/u64 (غير موقعة)، و f16/f32/f64 (كسرية). علامة عرض مجردة (بدون بادئة) تختزل النوع العددي العددي؛ بادئة عائلة تختزل مجموعة من ذلك العرض.

اختزالصيغة طويلةقاعدة الأقواس
i8u64, f16/f32/f64عدد<W>, كسر<W>لا شيء (علامة مجردة)
lf32, lu32, li64, …قائمة<f32>, قائمة<u32>, قائمة<i64>, …لا شيء
tf32, tf32[2, 3], ti64[N]tensor<f32, _>, tensor<f32, [2, 3]>, tensor<i64, [N]>Figura اختياري
sf32, sf32[2, 3], si64[N]sparsa<f32, _>, sparsa<f32, [2, 3]>, sparsa<i64, [N]>Figura اختياري
vf32, vf32[4], vu32[3]vector<f32, _>, vector<f32, 4>, vector<u32, 3>عرض واحد اختياري
mf32[4, 4], mf16[2, 2], mu32[3, 3]matrix<f32, [4, 4]>, matrix<f16, [2, 2]>, matrix<u32, [3, 3]>مطلوب، بعدين

أشكال الأقواس: [] هي رتبة-0، [2, 3] هو شكل ثابت، وعدم وجود أقواس يستنتج الشكل (_). المصفوفة تتطلب بعدين بالضبط. الاختزال لا يستخدم <> أبداً. لأنواع العناصر غير العرضية (مثلاً tensor<نص, [3]>)، استخدم الصيغة الكاملة.

الاختزال محجوز في صياغة النوع فقط — معرفات القيم المسماة tf32، lf32، إلخ. تبقى دون تغيير.

حلقة<W> ليس له اختزال؛ اكتب حلقة<u32> بالكامل.

تفضيل التهجئة (عرف المؤلف، وليس القواعد): كود Faber العام يميل نحو الصيغة الطويلة للقراءة؛ الوحدات العددية/الأولية للموتر قد تفضل الاختزال. اختر لكل وحدة أو ملف.

---

تدفق التحكم#

الشروط#

ifStmt     := 'إذا' expression arm ('وإلاإذا' ifStmt | elseClause)?
elseClause := 'وإلا' elseArm
arm        := (blockStmt | stmtBodyJoint statement) catchClause?
elseArm    := (blockStmt | stmtBodyJoint statement) catchClause?
  • إذا = if، وإلاإذا = else-if، وإلا = else
  • إذن للأجسام ذات العبارة الواحدة، بما في ذلك إذن أعد، إذن ارم، إذن انهر، و إذن صمت ( غير مقبول هنا)
  • صمت للا-عمل الصريح (من التدوين الموسيقي: "يسكت")

الحلقات#

whileStmt  := 'طالما' expression (blockStmt | stmtBodyJoint statement) catchClause?
iteraStmt  := 'كرر' (('من' | 'عن') expression | 'ab' expression) ('ثابت' | 'متغير') IDENTIFIER (blockStmt | stmtBodyJoint statement) catchClause?
  • طالما = while
  • كرر من...ثابت/كرر من...متغير = for-of (القيم)
  • كرر عن...ثابت/كرر عن...متغير = for-in (المفاتيح)
  • كرر ab range ثابت/متغير i = تكرار نطاق (مثلاً كرر ab 0‥10 كل 2 ثابت i { اعرض i }؛ كل ينتمي إلى تعبير النطاق)

التبديل/المطابقة#

eligeStmt    := 'اختر' expression '{' eligeCase* defaultCase? '}' catchClause?
eligeCase    := 'حالة' expression (blockStmt | stmtBodyJoint statement)
defaultCase  := 'افتراضي' (blockStmt | stmtBodyJoint statement)

مطابقة الأنماط#

discerneStmt := 'طابق' 'جميع'? discriminants '{' variantCase* defaultCase? '}'
discriminants := expression (',' expression)*
variantCase  := 'حالة' patterns (blockStmt | stmtBodyJoint statement)
patterns     := pattern ((',' | 'و') pattern)*
pattern      := '_' | literal | (IDENTIFIER patternBind?)
patternBind  := ('كـ' IDENTIFIER) | (('ثابت' | 'متغير') patternBinding (',' patternBinding)*)
patternBinding := IDENTIFIER ('كـ' IDENTIFIER)?

الحراس#

guardStmt   := 'احرس' '{' guardClause+ '}'
guardClause := 'إذا' expression (blockStmt | stmtBodyJoint statement)

إدارة الموارد#

curaStmt    := 'اعتن' STRING ('ثابت' | 'متغير') typeAnnotation IDENTIFIER blockStmt catchClause?

استخراج التفكيك#

extractStmt   := 'من' expression ('ثابت' | 'متغير') extractFields
extractFields := extractField (',' extractField)* (',' restField)? | restField
extractField  := IDENTIFIER ('كـ' IDENTIFIER)?
restField     := 'باقي' IDENTIFIER

نقل التحكم#

returnStmt   := 'أعد' expression?
breakStmt    := 'اكسر'
continueStmt := 'تابع'
noopStmt     := 'صمت'

---

معالجة الأخطاء#

throwStmt   := ('ارم' | 'انهر') expression ['إذا' expression]
catchClause := 'التقط' IDENTIFIER blockStmt
assertStmt  := 'أكد' expression ('secus' expression)?
  • التقط يرتبط بالعبارات المهيكلة وأذرع الشروط. لا يرتبط بالكتل المجردة الاعتباطية.
  • افعل { ... } التقط err { ... } هو حد الخطأ المحلي القابل للاسترداد القانوني أحادي اللقطة.
  • حاول هو سطح try/catch قديم ومرفوض بتشخيص ترحيل.
  • أخيرا هو سطح finally قديم ومرفوض بتشخيص ترحيل.
  • ارم = throw (قابل للاسترداد)، انهر = panic (قاتل).
  • حارس إذا <expr> الاختياري على ارم و انهر هو اختزال محلل: ارم val إذا cond يخفض إلى إذا cond { ارم val } زمن التحليل. بدون الحارس، العبارة غير مشروطة (سلوك غير متغير).
  • أكد فحص ثابت وقت التشغيل. يتحول إلى انهر "msg" إذا !cond مع إبقاء الشرط في صيغته الموجبة. secus يقدم رسالة المسار الخاطئ، مما يعكس دورها في si/secus والثلاثي sic/secus.

---

التعابير#

العوامل (حسب الأسبقية، من الأدنى إلى الأعلى)#

expression := assignment
assignment := ternary ('←' assignment | '↤' assignment inlineRecovery?)?
incDecStmt := place ('⊕' | '⊖')
ternary    := or (('?' expression ':' | 'فإذا' expression 'وإلا') ternary)?
or         := and (('أو') and)*
and        := equality (('و') equality)*
equality   := comparison (('≡' | '≠' | '≈' | '≉' | 'هو' | 'ليس' 'هو') comparison)*
comparison := bitwiseOr (('<' | '>' | '≤' | '≥' | 'ضمن' | 'بين') bitwiseOr)*
# عوامل الترتيب تستخدم رموز Unicode؛ العضوية تستخدم الكلمات المفتاحية `ضمن`/`بين`
# (هوية نثر Faber). الأسماء المستعارة الرمزية مثل `∈` ليست في العقد النشط.
bitwiseOr  := bitwiseXor ('∨' bitwiseXor)*
bitwiseXor := bitwiseAnd ('⊻' bitwiseAnd)*
bitwiseAnd := shift ('∧' shift)*
shift      := range (('⇐' | '⇒') range)*
range      := additive (('‥' | '…' | 'قبل' | 'حتى') additive ('كل' additive)?)?
additive   := multiplicative (('+' | '-') multiplicative)*
multiplicative := coalesce (('*' | '/' | '%') coalesce)*
# `عوض` هو إزالة محلية قابلة للإبطال (`T ∪ لاشيء عوض T → T`)، وليس `أو` منطقياً.
# يرتبط بقوة أكبر من الحساب لذا `prefix + item عوض ""` هو `prefix + (item عوض "")`.
# الجانب الأيمن لـ `عوض` قد يكمل بناء فترة (`maybeRange عوض 0‥0`).
coalesce   := unary ('عوض' velRhs)*
velRhs     := unary (('‥' | '…' | 'قبل' | 'حتى') unary ('كل' unary)?)?
unary      := ('-' | '¬' | 'ليس' | 'سلم' | 'أنشئ') unary | cast
cast       := call ('∷' typeAnnotation | conversio)*
conversio        := '↦' typeAnnotation typeParams? inlineRecovery?
inlineRecovery   := '⇥' unary

هي إسناد موجّه للتحويل: تُقيَّم الجهة اليمنى، ثم تُحوَّل إلى النوع الثابت للجهة اليسرى عبر مسار ، ثم يُسنَد إليها. للاسترداد الداخلي مسموح فقط بعد ، وليس بعد .

كلمات المسند المتقاعدة ليست صياغة أحادية بادئة. استخدم expr هو صواب، expr هو خطأ، expr هو لاشيء، expr ليس هو لاشيء، expr < 0، أو expr > 0.

إسناد النوع الساكن (`∷` / verte):

الرمز (U+2237، "تناسب") يسند نوع هدف بشكل صريح لتعبير. استخدمه عندما يكون تعبير المصدر موجوداً بالفعل ويحتاج المصرّف إلى شكل هدف ساكن:

  • أولي/اسم مستعار → تحويل (بدون تأثير زمن تشغيل): data ∷ نص → TypeScript: (data as string)
  • مجموعة مدمجة → قيمة مجموعة بشكل الهدف: [1, 2, 3] ∷ قائمة<عدد>
  • تعبير متغير → هدف تعداد/واجهة: أنشئ Click { x = 10 } ∷ Event

فضّل الإنشاء المنمط لقيم صنف العادية و فارغ لقيم المجموعات الفارغة العادية:

ثابت _ point ← Point { x = 10 }
ثابت قائمة<عدد> xs ← فارغ

فقط الرمز مقبول كعامل إسناد نوع ساكن لاحق. الصيغ اللاتينية qua، innatum، و novum كانت أسماء مستعارة وأُزيلت (انظر verte-alias-clean-break).

التحويل زمن التشغيل (`↦` / conversio):

الرمز (U+21A6، "سهم يمين من شريط") هو عامل تحويل القيم زمن التشغيل. على عكس (تحويل زمن التصريف)، هذا ينفذ تحليل/تحويل فعلي يمكن أن يفشل:

  • "22" ↦ عدد → Rust: "22".parse::<i64>().unwrap()
  • "bad" ↦ عدد ⇥ 0 → Rust: "bad".parse::<i64>().unwrap_or(0)
  • 42 ↦ نص → Rust: 42.to_string()

استرداد الفشل المضمن يستخدم مباشرة بعد هدف conversio (↦ T ⇥ recovery-expr). يجب أن يكون تعبير الاسترداد قيمة من النوع T.

استخدام عوض كاسترداد conversio مرفوض بتشخيص ترحيل. عوض هو إزالة محلية قابلة للإبطال فقط (x عوض y، افتراضيات المعاملات) — وليس أو منطقياً. نتيجة conversio المؤشرة قد تظل تتحد مع عوض كافتراض عادي.

الاستدعاء والوصول إلى الأعضاء#

call          := primary (callSuffix | memberSuffix | optionalSuffix | nonNullSuffix)*
callSuffix    := typeArgs? '(' argumentList ')'
memberSuffix  := '.' IDENTIFIER | '[' expression ']'
optionalSuffix := '?.' IDENTIFIER | '?[' expression ']' | '?(' argumentList ')'
nonNullSuffix := '!.' IDENTIFIER | '![' expression ']' | '!(' argumentList ')'
argumentList  := (argument (',' argument)*)?
argument      := 'انشر'? expression

حرفيات السلاسل والقوالب#

تستخدم Faber دلالات المحددات: كل صيغة اقتباس تعني شكلاً مصدرياً مختلفاً. إنها ليست مترادفات قابلة للتبادل.

الصيغةالنوعالدور
'...'أسكيرموز آلة ثابتة؛ لا §؛ لا (...)
"..."نصسلاسل Unicode قصيرة أحادية السطر؛ (...) يعرض
«...»نصكتلة/متعدد الأسطر Unicode؛ (...) يعرض
... formaقوالب ملتقطة؛ (...) يلتقط
{ ... }جسونمستند JSON كائني الجذر زمن التصريف (: بالداخل)
\|...\|بايتاتبايتات ست عشرية زمن التصريف
"..." ↦ تعبيرتعبيرنمط مجمع من تحويل نص
[ ... ]قائمة<T>قائمة Faber (ليست مصفوفة JSON، وليست بايتات)

§ (U+00A7) هو ثقب قالب في صيغ Unicode ("، «، ). لا يمكن أن يظهر في حرفيات أسكي`.

القوالب المعروضة (نص): "..."(...) و «...»(...) تخفض إلى حرر("...", args...).

القوالب الملتقطة (forma): ...(args) يلتقط نص القالب ومعاملاته بدون عرض. آمن لحمولات SQL/URL المرتبطة؛ لا تستخدم «...»(...) لهذه المهمة.

كتلة نص تستخدم guillemets «...». زوج علامات الاقتباس الثقيلة متقاعد (قريب بصرياً جداً من " في العديد من الخطوط).

حالة التنفيذ (2026-06-30):

  • تم الشحن: "..."، «...» كتلة نص، '...'أسكي، ... forma، |...|بايتات، { ... }جسون، و text/ascii ↦ تعبير.
  • قيد التسليم: حرفيات regex بشرطة مائلة /.../.

مثال كتلة مضمنة:

ثابت _ tag ← «inline»

مثال كتلة متعددة الأسطر (سطر جديد بعد « الافتتاحية):

ثابت _ blob ← «
    select id, email
    from accounts
»

مثال قالب ملتقط:

ثابت _ q ← `select * from accounts where id = §`(accountId)

مثال حرفية بايتات ست عشرية:

ثابت _ sig ← |de ad be ef|
ثابت _ hello ← |48 65 6c 6c 6f|

تطبيق قالب التنسيق#

صيغة استدعاء حرفية السلسلة هي الصيغة المصدرية القانونية لتطبيق قالب التنسيق:

"status: § (§)"(sample_status(), "ok")
"status: §1 (§0)"("ok", sample_status())

هذا يخفض إلى صيغة المصرّف حرر("...", args...). استخدم صيغة قالب السلسلة في المصدر العادي؛ احجز حرر(...) لأمثلة إزالة الاختزال الصريحة وتوثيق واجهة المصرّف.

لـ نص، فهرسة الأقواس مبنية على Unicode scalar:

"Salve, §!"[7]            # "§"
"hello world"[0‥5]        # "hello"
"hello world"[0 حتى 10] # "hello world"
"abcdef"[0‥6 كل 2]      # "ace"

شرائح النص تقبل صيغة النطاق الكاملة، بما في ذلك كل.

لـ قائمة<T>، فهرسة الأقواس هي وصول لعنصر واحد. يجب أن يكون الفهرس عدداً صحيحاً واحداً؛ شرائح النطاق غير مقبولة (استخدم sectio(start, end) لنطاق منسوخ):

xs[i]        # element at position i
xs[i] ← v    # write element at position i

وصول قوس قائمة هو عادي، وليس قابلاً للإبطال: يعيد العنصر المجرد T ويوقع على الخروج عن الحدود. هذا يختلف عن tensor، الذي تكون قراءة قوسه اختزال accipe وتعيد T ∪ لاشيء. لوصول القائمة القابل للإبطال، استخدم xs.accipe(i) → T ∪ لاشيء مع عوض.

لـ tensor<T, Figura>، فهرسة الأقواس هي اختزال على سطح الموتر الجوهري:

vector[id]        # vector.accipe([id])
vector[id] ← v    # vector.ponde([id], v)
grid[[r, c]]      # grid.accipe([r, c])
grid[[r, c]] ← v  # grid.ponde([r, c], v)

القراءات تعيد T ∪ لاشيء، مطابقة لـ accipe؛ استخدم عوض أو صيغة معالجة خيار عادية أخرى قبل الحساب. موترات الرتبة-1 تقبل فهارس عددية صحيحة تناسب حد زمن التشغيل i64 للموتر (u64 مرفوض). موترات الرتبة-N تستخدم تعبير فهرس بشكل قائمة مثل [[r, c]] أو قيمة قائمة<integer> مرتبطة. grid[r, c] ليس صياغة؛ memberSuffix لا يزال يحتوي على expression واحد بالضبط بين الأقواس.

بايتات هو أولي مخزن بايتات مؤقت، وليس مصفوفة، لذا فهرسة الأقواس غير مقبولة عليه (قراءة أو كتابة). وصول البايت معتمد على الطرق:

buf.accipe(i)      # → عدد<u8> ∪ لاشيء (nullable; safe on out-of-bounds)
buf.appende(b)     # append one byte in place
buf.longitudo      # byte length

هذا مقصود. بايتات هو المخزن المؤقت للبايتات الحدودي المعتم المستخدم بواسطة HAL، والتشفير، وحرفيات |hex|؛ قراءاته قابلة للإبطال افتراضياً، وصياغة الأقواس محجوزة لنموذج الوصول الموقع. للفهرسة الثقيلة بالبايتات، استخدم قائمة<عدد<u8>> داخلياً (قراءة/كتابة بالأقواس، توقع على الخروج عن الحدود) وأبق بايتات عند الحدود.

التعابير الأولية#

فارغ هو علامة مجموعة فارغة سياقية (صيغة معرف، وليس كلمة مفتاحية محجوزة). استخدمها مع نوع مجموعة صريح: ثابت قائمة<عدد> xs ← فارغ أو ثابت tensor<كسر<f32>, []> t ← فارغ.

primary := IDENTIFIER | NUMBER | STRING | ASCII_STRING | BACKTICK_STRING
         | 'ذات' | 'صواب' | 'خطأ' | 'لاشيء'
         | 'فارغ' | arrayLiteral | jsonLiteral | typedConstructor
         | adExpr
         | '(' expression ')'
adExpr    := 'اتصل' asciiLiteral adOpener?
arrayLiteral := '[' argumentList? ']'
# `{ ... }` المجرد هو حرفية مستند JSON. المفاتيح هي سلاسل JSON مقتبسة مفصولة
# بـ `:`؛ القيم هي ثوابت JSON. كائنات Faber المجهولة (`{ key = expr }`)
# متقاعدة (literal-family Stage 6). إنشاء صنف يستخدم `typedConstructor`.
jsonLiteral := '{' (jsonMember (',' jsonMember)* ','?)? '}'
jsonMember  := STRING ':' jsonValue
typedConstructor := typeAnnotation '{' fieldList? '}'
fieldList := fieldInit (',' fieldInit)*
fieldInit := ('انشر' expression) | (fieldKey '=' expression) | IDENTIFIER
fieldKey := IDENTIFIER | STRING | '[' expression ']'
# قيم JSON: ثوابت فقط (لا تعابير Faber، لا مراجع متغيرات).
jsonValue := jsonObject | jsonArray | jsonString | jsonNumber | 'true' | 'false' | 'null'
jsonObject := '{' (jsonMember (',' jsonMember)* ','?)? '}'
jsonArray  := '[' (jsonValue (',' jsonValue)* ','?)? ']'
jsonString := STRING
jsonNumber := NUMBER                       # عدد عندما لا يكون هناك '.'/e/E، وإلا كسر

STRING تشمل السلاسل القصيرة المحددة بـ " وسلاسل الكتلة المحددة بـ « و ». '...' (أسكي) والاقتباس الخلفي ... (forma) هما صيغ حرفية منفصلة (انظر حرفيات السلاسل والقوالب أعلاه).

{ ... } المجرد ينتج الآن مستند JSON كائني الجذر من النوع جسون: { "name": "Alice", "age": 30, "active": true }. المفاتيح هي سلاسل JSON مقتبسة مفصولة بـ :؛ القيم هي ثوابت JSON فقط. المفاتيح المكررة خطأ (التكرار الثاني). الإسناد إلى جدول<K,V> يخفض خريطة ثابتة حقيقية. استخدم ↦ قيمة للتوسيع الصريح إلى الحامل الديناميكي العريض. إنشاء صنف/variant Type { field = expr } يستخدم قواعد Faber = بدون تغيير.

التعابير الخاصة#

// verte (∷) هو لاحق — محلل في إنتاج cast أعلاه
fingeExpr     := 'أنشئ' IDENTIFIER ('{' fieldList '}')? ('∷' IDENTIFIER)?
praefixumExpr := 'بادئة' (blockStmt | '(' expression ')')
formatStringExpr := STRING '(' argumentList ')'                # يعرض نص عبر حرر
formaTemplateExpr := BACKTICK_STRING '(' argumentList ')'      # يلتقط forma
scriptumExpr  := 'حرر' '(' STRING (',' expression)* ')'   # صيغة صريحة/مزالة الاختزال
legeExpr      := 'اقرأ' 'سطرا'?
regexFromText   := (STRING | ASCII_STRING) '↦' 'تعبير'
# حرفيات regex بشرطة مائلة ليست قواعد نشطة بعد. `/` يحلل كعامل قسمة،
# بينما `//` و `/* ... */` مرفوضان كتعليقات غير صالحة.
# 'sed' STRING [IDENT] القديم أزيل؛ استخدم "..." ↦ تعبير.

---

الأنماط#

objectPattern  := '{' patternProperty (',' patternProperty)* '}'
patternProperty := 'باقي'? IDENTIFIER ('كـ' IDENTIFIER)?
arrayPattern   := '[' arrayPatternElement (',' arrayPatternElement)* ']'
arrayPatternElement := '_' | 'باقي'? IDENTIFIER

---

التشخيصات#

outputStmt := ('اعرض' | 'شاهد' | 'نبه' | 'اكتب') expression (',' expression)*
  • اعرض = ملاحظة تشخيصية محايدة، شاهد = تصحيح/فحص، نبه = تحذير
  • اكتب هو تهجئة قناة تشخيصية؛ استخدم طرق المكتبة القياسية الحالية للإخراج الحقيقي

التعليقات#

يقبل Faber تعليقات السطر فقط: # حتى نهاية السطر. يجب أن يكون # أول رمز غير مسافة بيضاء على السطر المنطقي (مسافات ASCII أو ألسنة بادئة اختيارية فقط — فواصل المسافات Unicode الأخرى لا يتخطاها المحلل المعجمي). # الذي يتبع أي رمز آخر على نفس السطر هو خطأ معجمي برسالة # comments must start a line; move this comment above the code.

التعليقات الصالحة في بداية السطر ترتبط للأمام كـ leading_trivia على العبارة أو التصريح التالي (انظر الحفاظ على التعليقات). # داخل حرفيات السلاسل، حرفيات أسكي، قوالب forma، والحرفيات المحددة الأخرى ليس تعليقاً.

---

نقاط الدخول#

incipitStmt  := 'بداية' blockStmt
incipietStmt := 'استهلال' blockStmt
  • بداية = دخول متزامن، استهلال = دخول غير متزامن

---

الاختبار#

probandumDecl := 'مختبر' STRING probaModifier* '{' probandumBody '}'
probandumBody := (praeparaBlock | probandumDecl | probaStmt)*
probaStmt     := 'اختبر' STRING probaModifier* blockStmt
probaModifier := 'أهمل' STRING | 'مستقبلي' STRING | 'فقط' | 'وسم' STRING
              | 'زمني' NUMBER | 'قس' | 'معاد' NUMBER | 'هش' NUMBER
              | 'يتطلب' STRING | 'حصري' STRING
praeparaBlock := ('جهز' | 'سيهيئ' | 'لاحق' | 'سيلحق') 'جميع'? blockStmt

---

إطار عمل CLI#

cliDecl       := annotation* (incipitStmt | funcDecl)
cliAnnotation := cliProgramAnnotation | imperiumAnnotation | optioAnnotation | operandusAnnotation

يدعم Faber بناء تطبيقات CLI مع تحليل آلي للوسائط وتوليد المساعدة.

نقطة دخول CLI#

@ cli "faber"
@ optio verbose longum "verbose" نمط منطقي
بداية وسائط args {
    # CLI framework automatically parses arguments
}

خيارات ووسائط CLI#

@ imperium "deploy"
@ optio target brevis "t" longum "target" نمط نص descriptio "Deployment target"
@ optio verbose brevis "v" longum "verbose" نمط منطقي descriptio "Enable verbose output"
@ operandus نص file descriptio "File to deploy"
دالة deploy() وسائط args {
    # Arguments automatically parsed and passed
}

---

استدعاءات القدرة#

صيغة التعبير اتصل هي سطح اتصل الوحيد المدعوم. اتصل "route" (args) → T { } المنمط القديم وتدفقات مستوى العبارة اتصل 'route' { meus/tuus … } مرفوضة زمن التحليل.

adExpr        := 'اتصل' asciiLiteral adOpener?
adOpener      := '(' expression ')'
conversioExpr := expr '↦' typeAnnotation
  • المسار: asciiLiteral ('solum:lege')، وليس STRING باقتباس مزدوج.
  • الفاتح: expression واحد اختياري → بيانات الطلب كـ قيمة.
  • تعبير `اتصل`: بدون كتلة؛ يُقيّم إلى مقبض محادثة sermo. استخدم اللاحق ↦ T (تجسيد)، أو أسند إلى sermo، أو افتح عروضاً اتجاهية حية: s.meus<T>() (صادر da / fini) و s.tuus<T>() (وارد accipe / مؤشر / exhauri / fini). كرر إطارات المحتوى الوارد بـ s.tuus<T>().مؤشر()، وليس كرر من s.tuus<T>() المباشر.
  • أزيل (خطأ تحليل): اتصل "route" المنمط القديم، أذرع meus/tuus الكتلية، و أرسل مستوى العبارة.
  • الأنواع: scrinium مملوك للمصرّف، status؛ sermo معتم كمقبض محادثة.
  • sermo ↦ T يجسد الإطارات الواردة إلى قيمة واحدة من النوع T باستخدام المجمع الموجه بالنوع لـ T.

انظر docs/design/frame-stream-types.md و docs/design/frame-stream-types.md.

---

عمليات المجموعات#

خط أنابيب المجموعات ab السابق متقاعد. تصفية المجموعات، تقطيعها، وتجميعها يُعبّر عنها عبر طرق نص/قائمة/جدول/مجموعة العادية والإغلاقات بدلاً من تعبير استعلام مستوى القواعد. نص، عدد، كسر، قائمة<T>، جدول<K,V>، و مجموعة<T> هي أنواع أساسية مملوكة للمصرّف؛ أسطح طرقها القانونية متتبعة في docs/design/textus-intrinsics.md، docs/design/numerus-intrinsics.md، docs/design/fractus-intrinsics.md، docs/design/lista-intrinsics.md، docs/design/tabula-intrinsics.md، و docs/design/copia-intrinsics.md، وليس في تصريحات Norma.

prima و ultima هما اسما طريقة عاديان، وليسا كلمتين تحويليتين مفتاحيتين. ubi ليس صياغة مجموعة نشطة.

من يُستخدم للتكرار (كرر من items ثابت x) والاستيرادات (استورد من "path").

---

كتلة Fac#

facBlockStmt := 'افعل' blockStmt catchClause? ('طالما' expression)?
  • افعل { ... } ينفذ الكتلة المحدودة مرة واحدة.
  • افعل { ... } التقط err { ... } هو حد الخطأ المحلي القابل للاسترداد القانوني.
  • افعل { ... } طالما condition هو صيغة حلقة ما بعد الاختبار؛ طالما اللاحق يرتبط فقط بـ افعل، وليس بالكتل السابقة الاعتباطية.

---

دعم الأهداف#

دعم الأهداف ليس جزءاً من القواعد — هذا الملف يعرّف اللغة فقط. لأي قواعد يخفضها كل هدف تصريف، وسياسة زمن التشغيل حولها، انظر:

  • EBNF_MATRIX.md — مصفوفة قابلية تخفيض القواعد×الهدف المولّدة (الصفوف الرسمية).
  • docs/design/target-capability-matrix.md — سياسة زمن التشغيل/العقد (مسح/تحذير/تأجيل)، توجيه خط الأنابيب، عقود لكل هدف.

---

مرجع الكلمات المفتاحية#

الفئةFaberالمعنى
التصريحاتتمايزاتحاد موسوم
ثابتconst
دالةfunction
صنفclass
عقدinterface contract
حجمsize/index generic parameter (في قوائم <>)
ترتيبenum
ليكنinferred immutable local
اختياريoptional declaration slot (post-name)
نمطtype alias
فارغcontextual empty collection marker
متغيرlet
تدفق التحكمإذا / وإلاإذا / وإلاif / else-if / else
احرسguard
طابقpattern match
طالماwhile
اختر / حالةswitch / case
افعلscoped block / local error boundary
كرر من...ثابتfor-of (values)
كرر عن...ثابتfor-in (keys)
كرر ab...ثابتrange iteration
تابعcontinue
أعدreturn
اكسرbreak
صمتno-op (silence)
إذنcompact one-statement body joint
compact clausura joint only
معالجة الأخطاءالتقطstructured local handler
أكدassert
ارمthrow
يرميthrows modifier
انهرpanic
افعل / التقطlocal recoverable-error boundary
غير متزامن@ مستقبليasync annotation
@ مؤشرgenerator annotation
سلمawait/yield by context
النقاط الطرفيةاتصلcapability call expression
أرسلretired statement-level frame emit
منطقيصوابtrue
أوor
وand
خطأfalse
ليسnot
عوضlocal nullable defaulting
الكائناتذاتthis/self
أنشئconstruct variant
شكل النوعstatic type ascription / compile-time cast
تحويل النوع↦ targetruntime value conversion
↦ T ⇥ exprconversio with inline recovery of type T
↦ عددparse to integer
↦ كسرparse to float
↦ نصconvert to string
↦ منطقيconvert to boolean
بتي / / / ¬and/or/xor/not
/ left/right shift
تشخيصاتاعرضneutral note
نبهwarn
اكتبdiagnostic channel
شاهدdebug/inspect

---

قواعد نحوية حرجة#

  1. معاملات النوع أولاً: دالة f(عدد x) وليس دالة f(x: عدد)
  2. تصريحات النوع أولاً: ثابت نص name وليس ثابت name: نص
  3. حلقات التكرار: كرر من/عن collection ثابت/متغير item { } أو كرر ab range ثابت/متغير item { } (الفعل أولاً، المصدر، ثم الربط)
  4. الأقواس حول الشروط صالحة لكنها غير اصطلاحية: فضّل إذا x > 0 { } أو إذا flag هو صواب { } على إذا (x > 0) { }
  5. كلمات التشخيص المفتاحية هي عبارات، وليست دوال — اعرض x تعمل، اعرض(x) تعمل أيضاً (الأقواس تجمع التعبير)، لكن اعرض ليست قيمة قابلة للاستدعاء

---

قائمة مصطلحات حزمة القارئ (استخراج آلي)#

الكلمات المفتاحية#

لاتينيمعرّب
abstractusمجرد
adاتصل
adfirmaأكد
anteقبل
argumentaوسائط
autأو
capeالتقط
casuحالة
cedeسلم
ceteriباقي
ceterumافتراضي
clausuraإغلاق
curaاعتن
curataمخصص
custodiاحرس
deعن
discerneطابق
discretioتمايز
dumطالما
egoذات
eligeاختر
ergoإذن
errataمخطئ
estهو
etو
exمن
exitusمخرج
facافعل
falsumخطأ
fingeأنشئ
fixumثابت
fragilisهش
functioدالة
futurumمستقبلي
generisسكوني
genusصنف
iaceارم
iacitيرمي
immutataثابتة
impletحقق
implendumعقد
importaاستورد
inفي
incipietاستهلال
incipitبداية
interبين
intraضمن
iteraكرر
legeاقرأ
lineamسطرا
magnitudoحجم
metiorقس
modulusحلقة
moneنبه
moriانهر
negativumسلبي
nexumمرتبط
nihilلاشيء
nonليس
nonnihilموجود
nonnullaمليء
notaاعرض
nullaخال
omitteأهمل
omniaجميع
optionesخيارات
ordoترتيب
perكل
pergeتابع
positivumموجب
postparaلاحق
postparabitسيلحق
praeسابق
praefixumبادئة
praeparaجهز
praeparabitسيهيئ
privataخاص
probaاختبر
probandumمختبر
protectaمحمي
publicaعام
reddeأعد
repeteمعاد
requiritيتطلب
rumpeاكسر
scribeاكتب
scriptumحرر
secusوإلا
siإذا
sicفإذا
sinوإلاإذا
sitليكن
solumفقط
solum_inحصري
spargeانشر
sponteاختياري
subامتد
tacetصمت
tagوسم
temporisزمني
typusنمط
usqueحتى
utكـ
variaمتغير
velعوض
verumصواب
videشاهد

الأنواع#

لاتينيمعرّب
asciiأسكي
bivalensمنطقي
copiaمجموعة
cursorمؤشر
fractusكسر
ignotumمجهول
instansلحظة
jsonجسون
listaقائمة
modulusحلقة
nihilلاشيء
numerusعدد
numquamأبدا
objectumكائن
octetiبايتات
promissumوعد
quidlibetمهما
regexتعبير
tabulaجدول
textusنص
vacuumفراغ
valorقيمة

تغييرات القائمة مقابل الحزمة الحالية#

لاتينيقديم في الحزمةجديد (هذا EBNF)السبب
genusنوعصنففك التعارض مع typus = "نمط"؛ التشخيصات تستخدم "صنف" باستمرار؛ "نوع" أقرب إلى type منه إلى class
incipiet(غير موجود)استهلالكلمة جديدة — دخول غير متزامن، مميزة عن incipit = "بداية"
sit(غير موجود)ليكنكلمة جديدة — محلي غير قابل للتغيير مستنتج
typus(غير موجود)نمطكلمة جديدة — اسم نوع مستعار
discretio(غير موجود)تمايزكلمة جديدة — اتحاد موسوم
implendum(غير موجود)عقدكلمة جديدة — عقد واجهة
modulus(غير موجود)حلقةكلمة جديدة — نوع كلمة حلقية
ordo(غير موجود)ترتيبكلمة جديدة — تعداد
abstractus(غير موجود)مجردكلمة جديدة — معدل صنف
ceteri(غير موجود)باقيكلمة جديدة — معامل باقي
curata(غير موجود)مخصصكلمة جديدة — متطلب مخصص
errata(غير موجود)مخطئكلمة جديدة — معدل خطأ
exitus(غير موجود)مخرجكلمة جديدة — معدل خروج
generis(غير موجود)سكونيكلمة جديدة — static
iacit(غير موجود)يرميكلمة جديدة — معدل throws
immutata(غير موجود)ثابتةكلمة جديدة — معدل غير قابل للتغيير
magnitudo(غير موجود)حجمكلمة جديدة — معامل حجم عام
nexum(غير موجود)مرتبطكلمة جديدة — bound/property
optiones(غير موجود)خياراتكلمة جديدة — معدل options
prae(غير موجود)سابقكلمة جديدة — كلمة قديمة/أزيلت
privata(غير موجود)خاصكلمة جديدة — رؤية خاصة
protecta(غير موجود)محميكلمة جديدة — رؤية محجوزة
publica(غير موجود)عامكلمة جديدة — رؤية عامة
sponte(غير موجود)اختياريكلمة جديدة — فتحة اختيارية
custodi(غير موجود)احرسكلمة جديدة — guard
ergo(غير موجود)إذنكلمة جديدة — رابط جسم عبارة مدمج
sic(غير موجود)فإذاكلمة جديدة — ternary then
adfirma(غير موجود)أكدكلمة جديدة — assert
iace(غير موجود)ارمكلمة جديدة — throw
mori(غير موجود)انهركلمة جديدة — panic
clausura(غير موجود)إغلاقكلمة جديدة — closure
vel(غير موجود)عوضكلمة جديدة — افتراضي محلي قابل للإبطال
ego(غير موجود)ذاتكلمة جديدة — self/this
finge(غير موجود)أنشئكلمة جديدة — إنشاء متغير
implet(غير موجود)حققكلمة جديدة — implements
sub(غير موجود)امتدكلمة جديدة — extends
cura(غير موجود)اعتنكلمة جديدة — إدارة موارد
cede(غير موجود)سلمكلمة جديدة — await/yield
lege(غير موجود)اقرأكلمة جديدة — read
lineam(غير موجود)سطراكلمة جديدة — line
omnia(غير موجود)جميعكلمة جديدة — wildcard
praefixum(غير موجود)بادئةكلمة جديدة — prefix expression
scriptum(غير موجود)حرركلمة جديدة — تحرير/عرض قالب
sparge(غير موجود)انشركلمة جديدة — spread
ante(غير موجود)قبلكلمة جديدة — قبل في النطاق
inter(غير موجود)بينكلمة جديدة — بين (نطاق حصري)
intra(غير موجود)ضمنكلمة جديدة — ضمن (نطاق/عضوية شامل)
per(غير موجود)كلكلمة جديدة — خطوة في النطاق
usque(غير موجود)حتىكلمة جديدة — حتى (حد نطاق شامل)
fragilis(غير موجود)هشكلمة جديدة — معدل اختبار fragile
futurum(غير موجود)مستقبليكلمة جديدة — معدل اختبار مستقبلي
metior(غير موجود)قسكلمة جديدة — معدل اختبار قياس
omitte(غير موجود)أهملكلمة جديدة — معدل اختبار skip
postpara(غير موجود)لاحقكلمة جديدة — post-prepare
postparabit(غير موجود)سيلحقكلمة جديدة — async post-prepare
praepara(غير موجود)جهزكلمة جديدة — prepare
praeparabit(غير موجود)سيهيئكلمة جديدة — async prepare
proba(غير موجود)اختبركلمة جديدة — test
probandum(غير موجود)مختبركلمة جديدة — test suite
repete(غير موجود)معادكلمة جديدة — معدل اختبار repeat
requirit(غير موجود)يتطلبكلمة جديدة — معدل اختبار requires
solum(غير موجود)فقطكلمة جديدة — معدل اختبار only
solum_in(غير موجود)حصريكلمة جديدة — معدل اختبار only-in
tag(غير موجود)وسمكلمة جديدة — معدل اختبار tag
temporis(غير موجود)زمنيكلمة جديدة — معدل اختبار time
negativum(غير موجود)سلبيكلمة جديدة — مسند سالب
nonnihil(غير موجود)موجودكلمة جديدة — مسند غير لاشيء
nonnulla(غير موجود)مليءكلمة جديدة — مسند غير فارغ
nulla(غير موجود)خالكلمة جديدة — مسند فارغ
positivum(غير موجود)موجبكلمة جديدة — مسند موجب
(أنواع) ascii(غير موجود)أسكينوع جديد — سلسلة ASCII
(أنواع) modulus(غير موجود)حلقةنوع جديد — كلمة حلقية
(أنواع) octeti(غير موجود)بايتاتنوع جديد — بايتات
(أنواع) regex(غير موجود)تعبيرنوع جديد — نمط مجمع
(أنواع) json(غير موجود)جسوننوع جديد — مستند JSON
(أنواع) valor(غير موجود)قيمةنوع جديد — قيمة ديناميكية
(أنواع) instans(غير موجود)لحظةنوع جديد — طابع زمني
(أنواع) objectum(غير موجود)كائننوع جديد — كائن
(أنواع) quidlibet(غير موجود)مهمانوع جديد — أي نوع
(أنواع) promissum(غير موجود)وعدنوع جديد — promise
(أنواع) numquam(غير موجود)أبدانوع جديد — never