Skip to main content

عربي — لغة برمجة عربية بالكامل

الإصدار الترخيص Python

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

ومنذ الإصدار 1.5 أصبحت اللغة متكاملة الأركان: تعداد، خصائص محسوبة، تحميل عوامل على الكائنات، أخطاء مخصصة ترث استثناء، تعبير ثلاثي، وأربع وحدات قياسية جديدة (عشوائية، نظام، تنظيم، شبكة) ووحدة تحويل حصرية تُفقط الأرقام إلى كلمات عربية.

وفي الإصدار 1.6 اكتمل النظام البيئي: إطار اختبارات داخل اللغة (وحدة اختبارات)، خوادم ويب حقيقية (وحدة خادم)، مدير حزم (--ثبت / --حزم) مع مجلد مكتبات/، منسق كود (--نسق)، فاحص مشكلات (--افحص)، مولد توثيق (--وثق)، ومفسر تفاعلي بسجل أوامر وإكمال تلقائي.

وفي الإصدار 1.7 اكتملت ميزات اللغة المتقدمة: المولدات بكلمة أنتج (قيم تباعًا بكفاءة ذاكرة)، المزخرفات بعلامة @ (مثل بايثون تمامًا)، والوراثة المتعددة بترتيب حل طرق C3، مع ثلاث وحدات قياسية جديدة: قاعدة (SQLite كاملة)، ترميز (Base64 والبصمات)، وجداول (ملفات CSV).

وفي الإصدار 1.8 جاء التزامن والتجريد: الواجهات بكلمة واجهة (عقد مجرد تلتزم به الأصناف مع تحقق عند الإنشاء)، المعاملات المتغيرة ...الاسم والتفكيك ...قائمة في الاستدعاءات والقوائم، ووحدة خيوط للتنفيذ المتوازي بذاكرة مشتركة (شغّل/قفل/طابور).

وفي الإصدار 1.9 جاءت التعبيرية: مطابقة الأنماط بكلمة طابق (أنماط حرفية وبدائل بأو والتقاط قيم وحرّاس إن شرط وتفكيك قوائم بـ...البقية وقواميس ومسارات قيم للتعدادات)، السلاسل الخام خ"..." بلا معالجة هروب (مثالية للتعبيرات النمطية)، ووحدة تواريخ الكاملة (إنشاء وتنسيق وتحليل وفروق وأيام أسبوع بالعربية).

وفي الإصدار 1.10 جاءت بيئة المطوّر: بروتوكول التكرار المخصص — أي صنف يعرّف تالٍ (مع أول الاختيارية) يعمل مباشرة مع لكل وفي والنشر ...، ووحدة إحصاء للتحليل الوصفي (معدل/وسيط/منوال/تباين/انحراف/مدى)، وخادم اللغة (LSP) الكامل (--لغة) الذي يوفر التشخيص اللحظي والإكمال الذكي والتلميحات ورموز المستند والانتقال للتعريف داخل أي محرر يدعم LSP.

وفي الإصدار 1.11 جاء الأداء والتعبيرية: فهم القوائم والقواميس — بناء متتاليات في سطر واحد بصيغة [تعبير لكل س في متتالية إن شرط] مع التفكيك وعبارات متتالية — والكود الوسيط (Bytecode) الذي يترجم شجرة البرنامج إلى صيغة مخزنة في __بايت__/*.بيت ويحمّلها في التشغيلات التالية متجاوزًا التحليل اللفظي والنحوي (تسريع ٥ أضعاف فأكثر للبرامج الكبيرة)، تلقائيًا للبرنامج الرئيسي وكل وحداته المستوردة.

وفي الإصدار 1.12 اكتمل النظام البيئي ببندته الأخيرة: سجل الحزم — مدير حزم كامل بأمر حزمة (تثبيت/إزالة/قائمة/بحث/تحديث) بفهرس مركزي قابَل للاستبدال، ونسخ دلالية بقيود ^ و~ و>=، وتبعيات تُحل تلقائيًا بكشف الدورات، وملف قفل قفل.json، وحزم تُثبت في حزم/ ويستوردها المفسّر تلقائيًا.

وفي الإصدار 1.13 صار التنفيذ نفسه أسرع: الدولاب الافتراضي (Virtual Machine) — المفسّر يترجم أجسام الدوال عند أول استدعاء إلى تعليمات بايت-كود تنفذها حلقة دولاب واحدة (تسريع يصل إلى ٢.٨× في الحلقات الحسابية و٢× في التعاود)، وكل جملة أو تعبير خارج المجموعة السريعة يعود للممسح الشجري الأصلي تلقائيًا — فالدلالات والأخطاء وأرقام الأسطر متطابقة دائمًا، وعلم --لا-دولاب يعيدك للمسار الأصلي متى شئت.

وفي الإصدار 1.14 اكتملت خارطة الطريق: الملف التنفيذي المستقل — المفسّر كله (المحللان والمفسر والدولاب والوحدات الثماني عشر ومدير الحزم وخادم اللغة) في ملف واحد قابل للتنفيذ يعمل بلا حاجة لبايثون على جهاز المستخدم، جاهز للتحميل من صفحة الإصدارات، وقابل لإعادة البناء على أي نظام بأمر واحد scripts/بناء_التنفيذي.sh.

وفي الإصدار 1.15 جاء غير المتزامن: غير متزامنة دالة تعمل في خيط مستقل فور استدعائها ويعيد الاستدعاء مهمة تنتظرها بكلمة انتظر — مع انتظر_الجميع لتجميع النتائج وسباق لأول من ينجز وانتظر_زمن لنوم المهمة — وأضافت وحدة شبكة دالة تنزيل لتحميل الملفات (تنزيلات متوازية بمهام غير متزامنة؟ سطران!).

وفي الإصدار 1.16 صار التوزيع والتشغيل الكثيف أسهل من أي وقت: تجمع الخيوط تجمع(٤) ينفذ أعمالك على عدد محدود من الخيوط المُعاد استخدامها (قدّم/إنهاء/حجم — ويحترم دلالات غير المتزامن بالكامل)، والتوزيع عبر pip (pip install arabi-lang ثم الأمر arabi)، وسير إصدارات آلي يبني التنفيذي المستقل على لينكس وويندوز وماك ويؤسس حزمة بايثون مع كل وسم جديد.

وفي الإصدار 1.17 كسرت الخيوط حدودها: توازي العمليات — وحدة عمليات تشغل أعمالك في معالجات منفصلة حقيقية بذاكرة معزولة تتجاوز قفل التفسير العالمي لبايثون (GIL)، فتستفيد الأعمال الحسابية الخالصة من كل أنوية الجهاز. الواجهة نفسها التي تعرفها: شغّل(دالة، وسائط) وتجمع(عدد) وقدّم وانتظر وانتظر_الجميع — والدوال والأصناف والكائنات والأخطاء المخصصة تعبر حدود العملية بهويتها كاملة.

وفي الإصدار 1.18 كسرت الجهاز الواحد حدوده: الحوسبة الموزعة — وحدة موزعة توزع مهامك على عدة أجهزة عبر الشبكة الحقيقية: موزع(منفذ) يبدأ خادم توزيع يستقبل اتصالات العمالة، وعامل(المضيف، المنفذ) يربط عاملاً بأي جهاز (أو الأمر الجاهز arabi --عامل المضيف:المنفذ)، وقدّم تعيد مهمة تنتظرها بـانتظر وانتظر_الجميع وسباق كما اعتدت — وانقطاع عامل يعيد أعماله للطابور فتخدمها عمالة أخرى، ولا تضيع مهمة.

وفي الإصدار 1.19 حصنت ما بنيت: الأمان والتشفير — وحدة تشفير تجلب حماية المكتبة القياسية إلى لغتك بلا أي تبعيات: بصمات قوية (هش/هش512 بست خوارزميات)، وتوقيع رسائل هوماك، ومقارنة زمن ثابت مقارنة_آمنة تفشل في التوقيت، ومفاتيح عشوائية آمنة تشفيريًا (مفتاح_آمن ورمز_آمن وعدد_آمن)، وتشفير كلمات المرور بـ PBKDF2 (شفر_كلمة وتحقق_كلمة — الملح عشوائي لكل كلمة والبصمة لا تُخزَّن أبدًا) واشتقاق المفاتيح مشتق — والموزع الموزع (1.18) صار يقبل مفتاحًا سريًا ثالثًا فيصبح لا عامل يُسجّل إلا بتوقيع تحدٍّ عشوائي بالمفتاح المشترك: موزع(0، "0.0.0.0"، تشفير.مفتاح_آمن()).

وفي الإصدار 1.20 صار لفريقك سجله الخاص: السجل المجتمعي — أمر حزمة خادم يشغّل خادم فهرس حزم كاملًا بنفس بروتوكول 1.12 تمامًا (تثبيت وبحث وتحديث وتبعيات وقفل — بلا أي تعديل في العميل، فقط وجّه --الفهرس إلى عنوان الخادم)، وأمر حزمة نشر ينشر حزمتك إليه — نسخ غير قابلة للتعديل، وفحص نحوي لكل حزمة قبل تخزينها، وفهرس يعرض الأحدث دومًا، ونشر محمي بتوقيع HMAC بمفتاح من تشفير (1.19) متى شئت — شبه بيدي الخاص على شبكتك أو على خادم فريقك.

وفي الإصدار 1.21 أُسدلت الستارة على آخر بند أمني: التشفير الكامل للبيانات العابرة — الموزع المفتاحي لم تعد مصادقته تحمي التسجيل وحده، فبعد قبول توقيع العامل تُشتق مفاتيح جلسة من المفتاح المشترك وتحدي المصافحة ويُغلَّف الاتصال بقناة مشفرة موثقة: كل أعمال العمالة ونتائجها ووداعها تُشفَّر بتيار HMAC-SHA256 في نمط العدّاد وتُوقَّع Encrypt-then-MAC، ويتحقق المستقبل من البصمة بمقارنة زمن ثابت قبل فك أي بايت — فتنصّت على السلك كما تشاء لن تفهم إطارًا واحدًا من كود مهامك أو نتائجها. والنفسية الشفرة متاحة لبرنامجك مباشرة: تشفير.شفّر(النص، المفتاح) وتشفير.فكّ(المشفر، المفتاح) بلا أي تبعيات خارجية.

وفي الإصدار 1.23 أُخضعت اللغة لتدقيق هندسي عميق (20 قسمًا بقراءة التنفيذ الفعلي) ثم أُغلق كل ما فيه خطر حرج: أمان البروتوكول الموزع صار JSON منمطًا لا ينفذ شيئًا لحظة الفك (كان فك المصافحة يسبق التحقق من التوقيع فأي طرف يصل للمنفذ ينفذ كودًا بايثونيًا)، وتطبيع Unicode (NFC) عند الدخول فلا تعدد صامت للمعرفات بصيغتين ولا انزلاق كلمة مفككة عن الكلمات المفتاحية، وأعمدة دقيقة في رسائل الأخطاء مع علامة تشير تحت الرمز المذنب وتهريب المحارف الخفية (BOM وعلامات الاتجاه تظهر U+XXXX باسمها العربي لا كمصفة)، وRecursionError عربية في جرب والمحلل وسطر الأوامر وREPL وLSP مع حد تعاود يحترم حجم المكدس الفعلي (كان يقسم العملية قطعيًا على بايثون ≤3.11)، وتكافؤ توقيت القاموس بين الدولاب والممسح زوجًا زوجًا، وإصلاحات انزياح الأسطر وBOM والأرقام الفارسية وفراغ اللصق (NBSP) وعداد أقواس النص المنسق، ونموذج ذاكرة موثق للتزامن.

وفي الإصدار 1.24 وُلّدت مواصفة اللغة الرسمية (docs/مواصفة-اللغة.md — EBNF كامل ودلالات محسومة لكل بنية، مستخرجة من التنفيذ الفعلي) وأُغلق قراراتها الحدية: باقي القسمة بالعلامة العربية ٪ كمعامل كامل مع الإسناد المركب ٪=/%=، والتقاط الأخطاء بالصنف باستثناء خطأ_الرصيد كـ هـ: مع عدد كتل حر وأول مطابق يفوز (والصيغ القديمة متوافقة)، والمزخرفات مع غير المتزامنة @مزخرف فوق غير متزامنة دالة، وسياسة التشكيل: يُقبل ولا يميز — لَوَ كلمة مفتاحية ومُهندس ومهندس متغير واحد (والسلاسل والتعليقات محتوى نصي لا يُمس)، والكشيدة جزء مشروع من المعرف مع إرشاد ذكي حين تخفي كلمة مفتاحية، وأرقام عربية كاملة: الفاصلة العشرية ٣٫١٤ وفاصل الآلاف ١٬٢٣٤، ورسائل دقيقة للمقارنات المتسلسلة (أ < ب < ج) والإسناد المتسلسل (أ = ب = ٣) بدل الرسائل المضللة.

وفي الإصدار 1.25 صقلت الطبقة التنفيذية (المرحلة ٣ من المواصفة): عقد بروتوكول التكرار محسوم — تالٍ تعيد قيمة واحدة أو ولا شيء للإنهاء، والدالة المعرفة بـأنتج تُرفض من موقع الاستهلاك برسالة موجّهة تعلمك العقد بدل حلقة تدور بلا نهاية بصمت، وانتظر_الجميع وسباق تقبل كل نتائج الشغل الخلفي — الخيوط من خيوط.شغّل والعمليات من عمليات.شغّل انضمت للمهام بواجهة واحدة مطابقة لـانتظر، والتكرار على مدى والنص صار بكسل — ذاكرة ثابتة مهما بلغ طول المدى (كانت الحلقة تموّده كقائمة)، وترجمة الدولاب تتم مرة واحدة لكل تعريف دالة حتى لو عُرّفت داخل حلقة ساخنة، مع قسمة نظيفة موثقة باختبار مواصفة وتكافؤ مثبت للصحة بين المسارين على القيم الحدية كلها، ولا تسريب لتمثيل بايثون الخام في عرض الخصائص والمنشئات الأصلية.

وفي الإصدار 1.22 حصل السجل المجتمعي على وجهه: واجهة متصفح عربية كاملة — افتح عنوان الخادم في المتصفح تجد لوحة RTL تعرض حالة السجل وحزمه مع مربّع بحث وصفحة تفاصيل لكل حزمة (النسخ بأحجامها وبصماتها وأمر التثبيت جاهزًا للنسخ)، كل ذلك بلا أي أصول خارجية: CSS مدمج ولا جافاسكربت — فتعمل اللوحة في الشبكات المعزولة كما يعمل الخادم نفسه، وكل قيمة قادمة من الحزم مهربة قبل عرضها، ومن يريد سطر الأوامر وحده يعطلها بـ--بلا_واجهة.

وفي الإصدار 1.26 أُضيف نظام الأنواع التدريجي (المرحلة ٤ من المواصفة — الفصل ٦ والقرارات ق١٣–ق١٦): صِف معاملات دوالك ونوع إرجاعها بالعربية — دالة متوسط(قيم: قائمة[عدد]) → عشري — فيفحص المفسر كل استدعاء وقت التشغيل ويرفع المخالف برسالة تعلمك وتذكر قيمتك ورقم العنصر المذنب، ويُفحص عقد الإرجاع على كل مسار أعد حتى السقوط الضمني، وتعمل الأصناف والواجهات أنواعًا بعقد سلسلة الوراثة (الابن يمر، وذات الواجهة يمر)، وتعمية بمستوى واحد قائمة[عدد] وقاموس[نص: عدد]، ولا كلمات محجوزة جديدة — العائلات (عدد، صحيح، عشري، نص، منطقي، قائمة، قاموس، مدى، دالة، أي، عدم) تحسم في موضع التوصيف فقط، والدوال بلا توصيف تعمل كما كانت بلا أي كلفة، مع إغلاق ثغرة كاش الترجمة في 1.25 (كان مفتاح id بلا مرجع قوي قد ينفذ ترجمة دالة أخرى بعد إعادة تعريف — انظر TestVmCacheIdentity).

وفي الإصدار 1.27 حصلت المكتبة القياسية على مرجع رسمي كامل: docs/مرجع-المكتبة-القياسية.md — الدوال الجاهزة الخمسة والعشرون والوحدات العشرون كلها بتوقيعاتها وسلوكها ورسائل أخطائها، ويحرسه اختبار انحدار يقارن أعضاء كل وحدة في زمن التشغيل الفعلي مع المرجع في الاتجاهين، فلا يدخل عضو جديد بلا توثيق ولا يوثق عضو غير موجود. ومعه: أمر --مساعدة يذكر الوحدات العشرين كلها (كان يذكر ١٧)، وتحذير أمني حي عند ربط الموزع عنوانًا غير محلي بلا مفتاح — لا تعرض بلا مصادقة يمر صامتًا.

وفي الإصدار 1.28 صارت بيئة المشروع مصدر الحقيقة (المرحلة ٦ — القرارات ق١٧–ق١٩): أمر حزمة إنشاء يبني هيكل مشروعك ببيان ومدخل نموذجي، والتثبيت بالاسم يسجّل التبعية في حزمة.json (حزمة تثبيت ادوات_نص>=1.0 تسجّل قيدك الصريح، وبلا قيد تسجّل ^النسخة)، والإزالة تمحوها من البيان، والتحديث يصحّح القيد المسجّل فقط حين تخالف النسخة الجديدة القيد (لا دسّ بلا داعٍ)، ومعها ثلاثة أوامر جديدة: مزامنة توازن بيئتك مع البيان (تثبت الناقص وتستبدل المخالف بتراجع آمن وتعلن حزم «الزيادة» بلا مسح صامت)، وترقيات تعرض ما له نسخة أحدث في السجل، وفحص يكشف انحراف القفل والبيان ومجلد الحزم ويخرج برمز 1 صالحًا لخطوط CI — وأُصلحت صيغة القيد الموثقة اسم>=1.0 في التثبيت (كانت موثقة بلا سلك فعلي).

بنيت اللغة بلغة بايثون (بدون أي مكتبات خارجية) كمفسر ينفذ الكود سطرًا بسطر، بطريقة مشابهة لفلسفة بايثون نفسها: بسيطة، مقروءة، والكتل تُحدد بالمسافات البادئة.

دالة مضروب(ن):
    لو ن <= ١:
        أعد ١
    أعد ن * مضروب(ن - ١)

اطبع("مضروب ٦ =", مضروب(٦))

المميزات

  • صياغة عربية بالكامل: لو، وإلا إذا، وإلا، بدّل، طالما، لكل، دالة، أعد، صح/خطأ…
  • أرقام بالصيغتين: استخدم ٤٢ أو 42 كما تشاء، والفاصلة ، أو ,
  • كتل بمسافات بادئة مثل بايثون — لا أقواس معقوصة تشوش الكود
  • دوال كاملة: معاملات، إرجاع قيم، تعاود، وإغلاق (Closures)
  • قيم افتراضية ومعاملات بالاسم (جديدة في 1.2): دالة فاتورة(الصنف، سعر = ١٠) واستدعاء بـفاتورة("قلم"، سعر = ٢٠)
  • دوال سهمية (جديدة في 1.2): ضاعف = دالة(س) => س * ٢ — دالة على سطر واحد تُمرر كقيمة
  • وحدات من ملفاتك (جديدة في 1.2): استورد هندسة أو من هندسة استورد مساحة — انظم مشروعك في ملفات .عربي
  • بدّل/حالة/افتراض (جديد في 1.3): تفرع أنظف من سلسلة لو الطويلة عند مقارنة قيمة واحدة
  • خريطة/مرشّح/اختزل (جديدة في 1.3): دوال ترتيب أعلى جاهزة تعمل مع السهميات
  • ملفات وجيسون (جديدة في 1.3): وحدة ملفات للكتابة والقراءة، ووحدة جيسون للحفظ والتبادل
  • سلاسل منسقة (جديدة في 1.4): ق"مرحبا {الاسم}، الناتج {أ + ب}" — حقن أي تعبير داخل النص مباشرة
  • نصوص متعددة الأسطر (جديدة في 1.4): ثلاث علامات اقتباس للنصوص الطويلة بلا هروب
  • طرق نصية أغنى (جديدة في 1.4): أوجد، يحتوي، عدد_التكرار، اعكس
  • تعداد (جديد في 1.5): تعداد يوم: السبت، الأحد… — ثوابت مسماة بقيم تلقائية أو صريحة
  • خصائص محسوبة (جديدة في 1.5): خاصية المساحة: — تُقرأ بلا أقواس وتُحسب عند كل وصول
  • تحميل العوامل (جديد في 1.5): عرّف اجمع واطرح ويساوي ونص وطول وفهرس في أصنافك فتدعم + و- و== والطباعة والفهرسة
  • أخطاء مخصصة (جديدة في 1.5): صنف خطأ_دفع من استثناء ثم باستثناء هـ: لربط الخطأ وقراءة هـ.رسالة
  • تعبير ثلاثي (جديد في 1.5): النتيجة = لو العمر >= ١٨: "بالغ" وإلا "طفل"
  • عالمي / تحقق / احذف (جديدة في 1.5): أدوات نضج كاملة للتحكم في النطاق والتحقق وحذف المتغيرات
  • خمس وحدات قياسية جديدة (جديدة في 1.5): عشوائية، نظام، تنظيم (تعبيرات نمطية)، شبكة (طلبات HTTP)، وتحويل (تفقيط الأرقام إلى كلمات عربية — حصري!)
  • المولدات (جديدة في 1.7): أنتج — دوال تنتج قيمًا تباعًا عند الطلب، تتكرر بـلكل وتُحوّل بـقائمة() وتتقدم يدويًا بـالتالي()
  • المزخرفات (جديدة في 1.7): @اسم فوق تعريف الدالة — قِس زمن التنفيذ، خزّن النتائج، وسّع دوالك بلا تعديلها
  • الوراثة المتعددة (جديدة في 1.7): صنف بطة من طائر، سباح بترتيب حل طرق C3 (كما في بايثون) مع الأصل المرتبط تلقائيًا
  • قواعد بيانات SQLite (جديدة في 1.7): وحدة قاعدة — أنشئ جداول وأدرج واستعلم بمعاملات آمنة من الحقن
  • ترميز وبصمات (جديدة في 1.7): وحدة ترميز — شفّر64 وفك64 وهش256 وهش1
  • جداول CSV (جديدة في 1.7): وحدة جداول — اقرأ واكتب وحلل ملفات البيانات بفواصل مخصصة
  • الواجهات (جديدة في 1.8): واجهة شكل: — طرق مجردة بلا جسم يجب تنفيذها، وتنفيذ افتراضي يورث، وثوابت مشتركة، والتحقق عند إنشاء الكائن برسائل عربية دقيقة
  • نظام الأنواع التدريجي (جديد في 1.26): دالة متوسط(قيم: قائمة[عدد]) → عشري — توصيف اختياري يفحص وقت التشغيل برسائل عربية موجّهة، وعائلات مدمجة (عدد، صحيح، عشري، نص، منطقي، قائمة، قاموس، مدى، دالة، أي، عدم)، والأصناف والواجهات أنواعًا بعقد الوراثة، وتعمية قاموس[نص: عدد] بمستوى واحد — بلا كلمات محجوزة وبلا كلفة على الكود غير الموصّف (الفصل ٦ من المواصفة)
  • المعاملات المتغيرة (جديدة في 1.8): دالة مجموع(...أرقام) — اجمع الوسائط الزائدة في قائمة (تعمل مع الدوال والسهميات والطرق)
  • التفكيك (جديد في 1.8): مجموع(...قائمة) يفتّ القائمة إلى وسائط، و[١، ...أخرى، ٩] يدمج القوائم والنصوص والمدى والمولدات
  • تنفيذ متوازي (جديد في 1.8): وحدة خيوط — شغّل وانتظر_الكل وقفل (احجز/افرح/محاولة) وطابور آمن للرسائل
  • مطابقة الأنماط (جديدة في 1.9): طابق قيمة ثم حالة نمط: — حرفيات، بدائل بأو، التقاط، الرمز البديل _، حرّاس إن شرط، تفكيك قوائم [أ، ...البقية]، قواميس {الاسم: ن}، ومسارات قيم للتعدادات
  • الالتقاط المتساوي (جديد في 1.9): التقاط مكرر داخل النمط [أ، أ] يعني "العنصران متساويان"
  • السلاسل الخام (جديدة في 1.9): خ"\d+" — الشرطة المائلة المعكوسة حرف عادي، تكتب أنماط التنظيم كما هي بلا مضاعفة
  • وحدة تواريخ (جديدة في 1.9): الآن وأنشئ وحلل وفرق وأضف ويوم_الأسبوع بأسماء أيام عربية، مع طرق السنة والشهر والنسق
  • بروتوكول التكرار المخصص (جديد في 1.10، عقده محسوم في 1.25): صنف يعرّف تالٍ() يصبح قابلًا للتكرار بـلكل — تعيد قيمة في كل استدعاء، وعودة ولا شيء تنهي التكرار، وأول() الاختيارية تعيد مؤشرًا جديدًا فيكل دورة، والدالة المعرفة بـأنتج مرفوضة كـتالٍ برسالة موجّهة (لا حلقات لا نهائية صامتة)
  • في والنشر على الكائنات (جديد في 1.10): س في كائن تمر على عناصر الكائن بتالٍ إن لم يعرّف يحتوي، و...كائن يفتّ عناصره في القوائم والاستدعاءات
  • وحدة إحصاء (جديدة في 1.10): معدل ووسيط ومنوال وتباين وانحراف ومدى — تحليل وصفي جاهز بأسماء عربية
  • خادم اللغة LSP (جديد في 1.10): python arabi.py --لغة — تشخيص لحظي، إكمال ذكي (بعد النقطة يفهم الوحدات والأصناف ويستدل على صنف المتغيرات)، تلميحات توثيق، رموز المستند، والانتقال إلى التعريف
  • فهم القوائم والقواميس (جديد في 1.11): [س * س لكل س في مدى(10) إن س % 2 == 0] و{ن: طول(ن) لكل ن في أسماء} — تحويل وترشيح وتفكيك وعبارات لكل متتالية، بنطاق مستقل لا يسرّب متغيراته
  • الكود الوسيط (جديد في 1.11): تحميل فوري من __بايت__/*.بيت عند صلاحية الذاكرة، إبطال تلقائي عند أي تعديل، وعلمان --بايت للترجمة فقط و--لا-بايت للتعطيل
  • سجل الحزم (1.12) وبيئة المشروع (1.28): python3 arabi.py حزمة تثبيت اسم_الحزمة — فهرس مركزي وتبعيات تُحل تعاوديًا وملف قفل قفل.json، والتثبيت بالاسم يُسجّل التبعية في بيان المشروع، ومزامنة وترقيات وفحص — والاستيراد من حزم/ تلقائي
  • نسخ دلالية وقيود (جديد في 1.12): >=1.0.0 و^1.2.3 و~1.2.3 و* — مطابقة semver مع كشف التبعيات الدائرية والتعارضات برسائل عربية
  • الدولاب الافتراضي (جديد في 1.13): ترجمة أجسام الدوال إلى بايت-كود تنفيذي بذاكرة على كل دالة — تسريع ٢.٨× للحلقات و٢× للتعاود مع احتياط شفاف للممسح الشجري وعلم --لا-دولاب
  • تكافؤ مضمون (جديد في 1.13): كل الاختبارات والقياسات تنفذ بالوضعين وتقارن — نفس المخرجات حرفيًا ونفس الأخطاء بنصوصها وأسطرها
  • ملف تنفيذي مستقل (جديد في 1.14): المفسّر كله في ملف واحد عربي يعمل بلا بايثون — جاهز للتحميل من الإصدارات وقابل لإعادة البناء بأمر واحد على أي نظام
  • تكييف تلقائي للنسخة التنفيذية (جديد في 1.14): --نسخة يعرض «تنفيذي مستقل» ورسائل الاستخدام تستخدم ./عربي — كل الأعلام والأدوات والوحدات تعمل كما هي
  • دوال غير متزامنة (جديد في 1.15): غير متزامنة دالة جلب(رابط): — الاستدعاء يشغّلها فورًا في خيط مستقل ويعيد مهمة تنتظرها بـانتظر مهمة
  • مجمّعات مهام (جديد في 1.15، موحّدة في 1.25): انتظر_الجميع([م١، م٢]) تجمع النتائج بترتيبها، وسباق([...]) تعيد أول مهمة تنجز — والقائمة تقبل كل نتائج الشغل الخلفي: مهام غير متزامنة، قدّم على التجمعات، خيوط خيوط.شغّل، عمليات عمليات.شغّل، ومهام الموزع — ومهمة.جاهز() ونتيجة() والخطأ() لفحص فوري
  • كلمة انتظر موحّدة وسياقية (جديد في 1.15): انتظر تعمل على المهام والخيوط معًا — وكلمة عادية أيضًا: ما يكسر خيط.انتظر() ولا أي معرف يحمل الاسم
  • تنزيل ملفات (جديد في 1.15): شبكة.تنزيل(رابط، مسار، مهلة؟) — تنزيل ثنائي آمن يعيد عدد البايتات، ويتكامل مع غير المتزامن لتنزيلات متوازية
  • تجمع خيوط محدود (جديد في 1.16): تجمع(٤) — عدد ثابت من الخيوط المُعاد استخدامها: قدّم(دالة، معاملات) تعيد مهمة، وإنهاء() تنتظر تصفية المقدَّم، وحد التزامن محفوظ تلقائيًا
  • توزيع عبر pip (جديد في 1.16): pip install arabi-lang ثم استخدم الأمر arabi أو python -m arabi — وثنائيات مستقلة لويندوز وماك تبني آليًا مع كل إصدار
  • برمجة كائنية: صنف، هذا، الوراثة بـمن، واستدعاء الأب بـالأصل
  • هياكل بيانات جاهزة: قوائم وقواميس بطرق عربية مثل أضف ورتب ومفاتيح
  • معالجة أخطاء حقيقية: جرب / باستثناء / اخيرا / ارفع مع رسائل عربية
  • توازي عمليات حقيقي (جديد في 1.17): عمليات.شغّل(دالة، وسائط) يشغل العمل في معالج منفصل بذاكرة معزولة يتجاوز GIL، وعمليات.تجمع(عدد) يوزع المهام على تجمع عمليات يُعاد استخدامه — والدوال بتعاودها وإغلاقها والأصناف والكائنات والأخطاء المخصصة تعبر العمليات شفافة
  • حوسبة موزعة عبر الشبكة (جديد في 1.18): موزعة.موزع(منفذ) خادم توزيع وموزعة.عامل(المضيف، المنفذ) عامل يخدم من أي جهاز (أو arabi --عامل المضيف:المنفذ) — إطارات موسومة بالطول عبر TCP، وانقطاع العامل يعيد أعماله للطابور، وانتظر_العمال للانتظار الحتمي
  • أمان وتشفير (جديد في 1.19): وحدة تشفير — بصمات هش بست خوارزميات وتوقيع هوماك ومقارنة زمن ثابت ومفاتيح ورموز آمنة وشفر_كلمة/تحقق_كلمة بـ PBKDF2 واشتقاق مشتق — ومصادقة اختيارية للموزعة بمفتاح مشترك: لا عامل يُسجّل إلا بتوقيع HMAC على تحدٍّ عشوائي
  • سجل مجتمعي (جديد في 1.20): حزمة خادم [مجلد] --منفذ ن --مفتاح سر يشغّل خادم فهرس حزم كاملًا (فهرس وتنزيل وبحث وبيانات ونشر) بنفس بروتوكول العميل، وحزمة نشر مسار --الفهرس رابط [--نسخة س] [--مفتاح سر] ينشر حزمتك — نسخ غير قابلة للتعديل وفحص نحوي وتوقيع HMAC اختياري
  • تشفير كامل للبيانات العابرة (جديد في 1.21): الموزع المفتاحي يشفّر كل أعماله ونتائجها بعد المصافحة بتيار HMAC-SHA256 العدّادي موقّعًا Encrypt-then-MAC — مفاتيح جلسة مشتقة من المفتاح وتحدي كل اتصال، ولا تعديل أو إعادة تشغيل يمر — وموزع.مشفّر() تعرض الحالة، والشفرة نفسها لبرنامجك: تشفير.شفّر/فكّ
  • الأمان والصحة الحرجة (جديد في 1.23): بروتوكول الموزعة JSON آمن بلا pickle على أي حد شبكي، وتطبيع NFC وأعمدة وتهريب في كل رسائل الخطأ، وRecursionError عربية في كل المسارات مع حد تعاود آمن بحجم المكدس، وتكافؤ توقيت القاموس بالدولاب، وإصلاح انزياح الأسطر وBOM والفارسية وفراغ اللصق
  • مواصفة اللغة والقرارات المحسومة (جديد في 1.24): المعامل ٪ و٪=، والتقاط بالصنف بكـ، والمزخرفات مع غير المتزامنة، وسياسة تشكيل وكشيدة وbidi موثقة، وأرقام ٫ و٬، ورسائل دقيقة للصيغ المرفوضة — كلها في docs/مواصفة-اللغة.md
  • واجهة متصفح للسجل (جديد في 1.22): الجذر / لوحة عربية RTL بحزم السجل وبحث فوري وصفحات تفاصيل /عرض/<اسم> بالنسخ والأحجام والبصمات — CSS مدمج بلا أصول خارجية ولا جافاسكربت، وكل قيمة مهربة بـ html.escape، و--بلا_واجهة تعيد الجذر نصًا كما كان
  • تسلسل تزامني متكامل: خيوط (1.8) ← غير متزامن (1.15) ← تجمع خيوط (1.16) ← عمليات (1.17) ← موزع على الأجهزة (1.18) — واجهة انتظار واحدة (انتظر وانتظر_الجميع وسباق) على الخمسة
  • وحدات جاهزة (20 وحدة): رياضيات، وقت، ملفات، جيسون، عشوائية، نظام، تنظيم، شبكة، تحويل، اختبارات، خادم، قاعدة، ترميز، جداول، خيوط، تواريخ، إحصاء، عمليات، موزعة، تشفير
  • امتداد VS Code: تلوين بناء الجملة ومقتطفات كود للملفات .عربي
  • أداة فحص الصياغة (جديدة في 1.5): python3 arabi.py --تحقق ملف.عربي بلا تنفيذ
  • إطار اختبارات داخل اللغة (جديد في 1.6): وحدة اختبارات بدوال يساوي ويصح ويرفع وملخص
  • خوادم ويب حقيقية (جديدة في 1.6): وحدة خادم — خادم.ابدأ(المنفذ، معالج) يخدم صفحات وواجهات API
  • أدوات النظام البيئي (جديدة في 1.6): --نسق منسق كود، --افحص فاحص مشكلات، --وثق مولد توثيق، --ثبت/--حزم مدير حزم بمجلد مكتبات/
  • مفاتيح قواميس بلا اقتباس (جديدة في 1.6): {الحالة: 200} ≡ {"الحالة": 200}
  • نصوص منسقة متعددة الأسطر (جديدة في 1.6): ق"""قالب HTML كامل {متغير}"""
  • مفسر تفاعلي (REPL) لتجربة الأوامر فورًا
  • رسائل خطأ تُعلّمك: رقم السطر + محتواه + إشارة إلى موضع الخطأ + اقتراح الحل

المتطلبات والتشغيل

تحتاج فقط بايثون 3.8 أو أحدث، لا شيء آخر:

# استنساخ المشروع
git clone https://github.com/CTO-DRS/arabi-lang.git
cd arabi-lang

# تشغيل ملف
python3 arabi.py examples/01_مرحبا_بالعالم.عربي

# فتح المفسر التفاعلي
python3 arabi.py

# تنفيذ كود مباشر
python3 arabi.py -c 'اطبع("مرحبا!")'

امتداد ملفات اللغة هو .عربي.

بلا بايثون؟ خذ التنفيذي المستقل

صفحة الإصدارات (Releases) تحمل الملف التنفيذي الجاهز للينكس ٦٤-بت: حمّله، امنحه صلاحية التنفيذ، وشغّل مباشرة — لا يحتاج بايثون ولا أي تثبيت:

chmod +x عربي
./عربي examples/01_مرحبا_بالعالم.عربي

ولبنائه بنفسك على أي نظام (لينكس/ويندوز/ماك): python3 -m pip install pyinstaller ثم scripts/بناء_التنفيذي.sh — التفاصيل في قسم «الملف التنفيذي المستقل» أدناه.


دليل اللغة

التعليقات

# هذا تعليق، يبدأ بعلامة # وينتهي بنهاية السطر
اطبع("الكود يعمل")  # ويمكن أن يكون بجانب الكود

المتغيرات

لا حاجة لإعلان النوع، الإسناد ينشئ المتغير:

الاسم = "أحمد"
العمر = ٢٥
الطول = ١.٧٥
متاح = صح

العمليات الحسابية

العملية المعامل مثال النتيجة
الجمع + ٥ + ٢ 7
الطرح - ٥ - ٢ 3
الضرب * ٥ * ٢ 10
القسمة / ١٠ / ٢ 5
باقي القسمة % أو ٪ ١٠ ٪ ٣ 1
الأس ** ٢ ** ٣ 8

القسمة تعطي عددًا صحيحًا إذا كانت النتيجة صحيحة (١٠ / ٢ تعطي 5)، وعددًا عشريًا غير ذلك (٧ / ٢ تعطي 3.5).

المقارنات والمنطق

٥ > ٣          # صح
الاسم == "أحمد"
العدد != ١٠
أ <= ب

# المنطق
صح و خطأ       # خطأ
صح أو خطأ      # صح
ليس صح         # خطأ

# العضوية
"تفاح" في فواكه
"عنب" ليس في فواكه

الشروط

لو الدرجة >= ٩٠:
    اطبع("ممتاز")
وإلا إذا الدرجة >= ٨٠:
    اطبع("جيد جدًا")
وإلا:
    اطبع("حاول مرة أخرى")

الحلقات

# لكل — المرور على تسلسل
لكل عدد في مدى(١، ٦):
    اطبع(عدد)

# طالما — تكرار بشرط
طالما الرصيد > ٠:
    الرصيد -= ١٠

# كسر — خروج من الحلقة
# استمر — تخطي الدورة الحالية

بدّل / حالة / افتراض

بديل أنظف لسلسلة طويلة من لو / وإلا إذا عند مقارنة قيمة واحدة بقيم متعددة:

بدّل يوم
حالة "السبت":
    اطبع("عطلة")
حالة "الأحد":
    اطبع("عطلة أيضًا")
افتراض:
    اطبع("يوم عمل")
  • تُقارن قيمة بدّل بالحالات بالترتيب حتى أول تطابق، وتُنفّذ كتلتها وحدها (لا تساقط مثل C)
  • كتلة افتراض تُنفّذ إن لم تتطابق أي حالة، وهي اختيارية
  • قيم الحالات يمكن أن تكون أي تعبير: نصوص، أعداد، أو حسابات
  • كسر داخل بدّل داخل حلقة يخرج من الحلقة نفسها

مطابقة الأنماط (جديدة في 1.9)

طابق أقوى من بدّل: النمط لا يقارن فقط بل يفكك البنية ويلتقط القيم ويربطها:

طابق قائمة
حالة []:
    اطبع("فارغة")
حالة [أول، ...البقية]:
    اطبع("أولها", أول، "وبقيت", طول(البقية))
غير ذلك:
    اطبع("ليست قائمة")

أنماط مدعومة:

النمط يطابق مثال
حرفية قيمة يساويها بالضبط حالة ٥: / حالة "نص": / حالة -١:
بدائل أي نمط من البدائل حالة ١ أو ٢ أو ٣:
التقاط أي قيمة ويربطها باسم حالة ن: ثم استخدام ن داخل الكتلة
الرمز البديل _ أي قيمة بلا ربط حالة _:
حارس النمط بشرط إضافي حالة ن إن ن > ١٠:
قائمة بنية قائمة بطول محدد حالة [أ، ب]:
قائمة مع البقية بادئة ثابتة والزائد يُجمع حالة [أ، ...البقية]: أو حالة [أ، ...]:
التقاط متكرر تساوي العناصر الملتقَطة حالة [أ، أ]: (العنصران متساويان)
قاموس مفاتيح موجودة وقيم تطابق حالة {الاسم: ن، العمر: ع}: (الزائد مسموح)
مسار قيمة تساوي مع تعبير (مثالي للتعدادات) حالة لون.أحمر:

مثال تكاملي — تعداد مع مطابقة القيم والحرّاس:

تعداد حالة_الطلب:
    جديد
    قيد_التنفيذ
    مكتمل

طابق الطلب.الحالة
حالة حالة_الطلب.جديد:
    اطبع("ابدأ التنفيذ")
حالة حالة_الطلب.قيد_التنفيذ إن الأولوية > ٥:
    اطبع("عجّل به!")
حالة _:
    اطبع("لا حاجة لفعل شيء")
  • روابط الالتقاط تبقى متاحة بعد انتهاء المطابقة (كما في بايثون)
  • الأنماط تُجرب بالترتيب، وفشل الحارس ينقل للنمط التالي

السلاسل الخام (جديدة في 1.9)

البادئة خ قبل النص تعطّل معالجة الهروب — الشرطة المائلة المعكوسة حرف عادي:

عادي = "س\\ط"      # تكتب شرطتين لتحصل على شرطة
خام = خ"س\\ط"     # تكتب شرطة واحدة — الناتج: س\\ط

استورد تنظيم
اطبع(تنظيم.كل_المطابقات(خ"\\d+"، "أ ١٢ ب ٣٤٥"))   # [١٢، ٣٤٥]
  • تدعم أيضًا النصوص الخام متعددة الأسطر: خ"""..."""
  • مثالية لأنماط التعبيرات النمطية ومسارات ويندوز والنصوص الحرفية

الدوال

دالة مساحة_المستطيل(العرض، الارتفاع):
    أعد العرض * الارتفاع

دالة ترحيب(الاسم):
    اطبع("مرحبا", الاسم)

المساحة = مساحة_المستطيل(٥، ٨)

الإسناد المتعدد مفيد لتبديل القيم:

أ، ب = ١، ٢
أ، ب = ب، أ      # تبديل

القيم الافتراضية والمعاملات بالاسم

يمكن إعطاء المعاملات قيمًا افتراضية، واستدعاء الدالة بالأسماء لقراءة أوضح:

دالة فاتورة(الصنف، الكمية = ١، سعر = ١٠):
    أعد الصنف + ": " + نص(الكمية * سعر)

اطبع(فاتورة("قلم"))                  # تستخدم الافتراضيات
اطبع(فاتورة("دفتر"، ٣))               # الكمية موضعيًا
اطبع(فاتورة("حاسبة"، سعر = ١٥٠))     # بالاسم — الترتيب لا يهم

الدوال السهمية

دالة على سطر واحد بتعبير واحد، تُخزن في متغير وتُمرر كقيمة:

ضاعف = دالة(س) => س * ٢
اطبع(ضاعف(٢١))                    # 42

عمليات = [دالة(س) => س + ١، دالة(س) => س * ١٠]
اطبع(عمليات[١](٥))                # 50

# تُمرر كمعامل إلى دالة أخرى
دالة طبق(قيمة، تحويل):
    أعد تحويل(قيمة)

اطبع(طبق(٥، دالة(س) => س * س))    # 25

خريطة / مرشّح / اختزل

دوال جاهزة ذات ترتيب أعلى تعالج قائمة كاملة بدالة تحددها أنت:

أعداد = [١، ٢، ٣، ٤]

خريطة(دالة(س) => س * س، أعداد)         # [1، 4، 9، 16]
مرشّح(دالة(س) => س % ٢ == ٠، أعداد)    # [2، 4]
اختزل(دالة(أ، ب) => أ + ب، أعداد)      # 10 — تطوي القائمة لقيمة
اختزل(دالة(أ، ب) => أ + ب، أعداد، ١٠٠) # 110 — مع قيمة بداية

# تتعامل مع النصوص والمدى أيضًا
خريطة(دالة(ح) => كبير(ح)، "أب")        # [أ، ب]

المعاملات المتغيرة والتفكيك (جديدة في 1.8)

...الاسم في تعريف الدالة يجمع الوسائط الزائدة في قائمة:

دالة مجموع(...أرقام):
    م = ٠
    لكل أ في أرقام:
        م += أ
    أعد م

مجموع(١، ٢، ٣)              # 6 — العدد غير محدود
مجموع()                    # 0

# تُخلط بالمعاملات الثابتة والمتغيرة بالاسم والافتراضية
دالة تقرير(عنوان، دقة = ٢، ...قيم):
    أعد عنوان + ": " + نص(قيم)

و...التعبير عند الاستدعاء تفتّ القائمة (أو النص أو المدى أو المولد) إلى وسائط:

درجات = [٤٢، ٣٧]
أقصى(...درجات)              # يستدعي أقصى(٤٢، ٣٧)

# التفكيك داخل القوائم الحرفية يدمج المحتوى
ممتدة = [١، ...درجات، ٩]      # [1، 42، 37، 9]

القوائم

فواكه = ["تفاح"، "موز"، "برتقال"]

فواكه[٠]          # "تفاح" — الفهرسة تبدأ من صفر
فواكه[-١]         # "برتقال" — من النهاية
فواكه[٠:٢]        # تقطيع: ["تفاح"، "موز"]
طول(فواكه)        # 3

# الطرق الجاهزة
فواكه.أضف("عنب")       # إضافة عنصر
فواكه.أزل("موز")       # حذف قيمة
فواكه.رتب()            # ترتيب
فواكه.اعكس()           # عكس
فواكه.انبثق()          # سحب آخر عنصر
فواكه.عدد_التكرار("تفاح")
فواكه.انسخ()           # نسخة جديدة

القواميس

شخص = {"الاسم": "خالد"، "العمر": ٣٠}

شخص["الاسم"]          # "خالد"
شخص["الوظيفة"] = "مهندس"   # إضافة مفتاح جديد

# الطرق الجاهزة
شخص.مفاتيح()          # ["الاسم"، "العمر"، "الوظيفة"]
شخص.قيم()             # ["خالد"، ٣٠، "مهندس"]
شخص.عناصر()           # [["الاسم"، "خالد"]، ...]
شخص.احذف("العمر")

المرور على المفاتيح والقيم معًا بالتفكيك:

لكل مفتاح، قيمة في شخص.عناصر():
    اطبع(مفتاح، "=>", قيمة)

النصوص والسلاسل المنسقة

السلاسل المنسقة — ق"..."

البادئة ق (قالب) تحوّل النص إلى قالب تُحقن فيه أي قيمة أو تعبير داخل {أقواس} — لا حاجة لقص وتجميع:

الاسم = "سلمى"
العمر = ٢٥

ق"مرحبا {الاسم}"                       # مرحبا سلمى
ق"بعد ٥ سنوات: {العمر + ٥}"             # بعد ٥ سنوات: 30
ق"طول الاسم {طول(الاسم)} حرفًا"          # استدعاء دوال
ق"الاسم كبيرًا: {الاسم.كبير()}"           # استدعاء طرق
ق"هل بالغ؟ {العمر >= ١٨}"               # صح

# عناصر القوائم والقواميس مباشرة
درجات = [٩٢، ٨٨، ٩٥]
ق"أعلى درجة: {درجات[٢]}"

طالب = {"الاسم": "خالد"}
ق"أهلًا {طالب["الاسم"]}"                 # اقتباس متشابه داخل الأقواس — مسموح

# ف-نص داخل ف-نص
ق"التقدير: {ق"«{طالب["الاسم"]}»"}"

# أقواس حرفية — ضعها مضاعفة
ق"القاموس يُكتب: {{مفتاح: قيمة}}"
  • أي تعبير صالح يمكن وضعه داخل {}: حساب، مقارنة، استدعاء دالة أو طريقة، فهرسة، حتى ف-نص آخر
  • داخل الأقواس يُسمح بعلامات اقتباس من نفس النوع ما دمت داخل أقواس — ق"{طالب["الاسم"]}" تعمل
  • {{ و}} تعني قوسًا حرفيًا واحدًا

النصوص متعددة الأسطر

ثلاث علامات اقتباس لنص يمتد على عدة أسطر — مع الحفاظ على الأسطر والمسافات:

الشعار = """لغة عربي:
  لغة برمجة بالعربية الفصحى
  من القلب إلى العالم"""

الحوار = '''قال المعلم: "من يريد البرمجة؟"'''
# اقتباسات عادية داخل النص بلا هروب

الطرق النصية

الطريقة الوظيفة مثال
استبدل(قديم، جديد) استبدال الأجزاء "سلام".استبدل("س"، "و")
قسّم(فاصل) تقطيع إلى قائمة "أ، ب".قسّم("،")
اجمع(قائمة) دمج قائمة نصوص "-".اجمع(["أ"، "ب"])
شريط() إزالة المسافات الطرفية " نص ".شريط()
يبدأ_بـ(نص) / ينتهي_بـ(نص) فحص البداية والنهاية "2024".يبدأ_بـ("20")
كبير() / صغير() تحويل الحالة "abc".كبير() → ABC
أوجد(نص) (جديدة في 1.4) موقع أول ظهور أو -1 "مرحبا".أوجد("حب") → 2
يحتوي(نص) (جديدة في 1.4) هل النص يتضمن الجزء؟ "عربية".يحتوي("عرب") → صح
عدد_التكرار(نص) (جديدة في 1.4) كم مرة ظهر "أبأبأ".عدد_التكرار("أب") → 2
اعكس() (جديدة في 1.4) النص معكوسًا "مرحبا".اعكس() → ابحرم

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

جرب:
    النتيجة = ١٠ / ٠
باستثناء:
    اطبع("لا يمكن القسمة على صفر")
اخيرا:
    اطبع("هذا السطر يُنفذ دائمًا")

# رمي خطأ مخصص
لو العمر < ٠:
    ارفع "العمر لا يمكن أن يكون سالبًا"

ربط الخطأ وقراءته (جديد في 1.5) — اكتب اسمًا بعد باستثناء لتصل إلى تفاصيل الخطأ:

جرب:
    النتيجة = ١٠ / ٠
باستثناء هـ:
    اطبع("حدث خطأ: " + هـ)      # هـ = رسالة الخطأ

التقاط بالصنف (جديد في 1.24) — ميّز بين أنواع الأخطاء بكلمة كـ، مع عدد كتل باستثناء حر وأول مطابق يفوز؛ وأخطاء التشغيل المدمجة (كالقسمة على صفر) تمسكها الكتل العامة فقط:

صنف خطأ_رصيد من استثناء:
    دالة إنشاء(رسالة):
        هذا.رسالة = رسالة

جرب:
    ارفع خطأ_رصيد("الرصيد غير كافٍ")
باستثناء خطأ_رصيد كـ هـ:
    اطبع(هـ.رسالة)              # يلتقط هذا الصنف وأبناءه
باستثناء كـ هـ:
    اطبع("خطأ آخر: " + هـ)
اخيرا:
    اطبع("دائمًا")

أخطاء مخصصة بصنف (جديد في 1.5) — عرّف صنفًا يرث استثناء المدمج، وأرفعه كأي كائن:

صنف خطأ_دفع من استثناء:
    دالة تفاصيل():
        أعد ق"سبب الفشل: {هذا.رسالة}"

جرب:
    ارفع خطأ_دفع("الرصيد غير كافٍ")
باستثناء هـ:
    اطبع(هـ.رسالة)                # الرصيد غير كافٍ
    اطبع(هـ.تفاصيل())             # سبب الفشل: الرصيد غير كافٍ

تحقق (جديد في 1.5) — يرفع خطأ فورًا إذا كان الشرط خطأ، مفيد لضمان صحفية البيانات:

دالة سحب(الرصيد، المبلغ):
    تحقق المبلغ > ٠، "المبلغ يجب أن يكون موجبًا"
    تحقق المبلغ <= الرصيد، "الرصيد غير كافٍ"
    أعد الرصيد - المبلغ

التعبير الثلاثي

شرط مضغوط على سطر واحد يعيد قيمة — مثالي داخل الإسناد والاستدعاءات:

العمر = ٢٠
الحالة = لو العمر >= ١٨: "بالغ" وإلا "طفل"
اطبع(الحالة)                    # بالغ

# يتداخل أيضًا
تصنيف = لو الدرجة >= ٩٠: "ممتاز" وإلا لو الدرجة >= ٧٥: "جيد" وإلا "متوسط"

تعداد

مجموعة ثوابت مسماة — كل عضو بلا قيمة يأخذ رقمًا تلقائيًا يبدأ من ١:

تعداد يوم:
    السبت
    الأحد
    الاثنين

اطبع(يوم.السبت)                 # يوم.السبت
اطبع(يوم.الأحد.القيمة)          # 2
اطبع(يوم.السبت.الاسم)           # السبت

لو اليوم == يوم.السبت:
    اطبع("عطلة نهاية الأسبوع")

ويمكن تحديد القيم صراحة، فيواصل الترقيم بعدها:

تعداد أولوية:
    منخفضة
    عالية = ١٠
    حرجة                        # ١١

البرمجة الكائنية

عرّف أصنافك بكلمة صنف، وادفع إلى خصائص الكائن عبر هذا:

صنف حيوان:
    دالة إنشاء(اسم):
        هذا.اسم = اسم

    دالة صوت():
        أعد "..."

ك = حيوان("أسد")
اطبع(ك.اسم)
اطبع(ك.صوت())

الوراثة بكلمة من، واستدعاء طرق الأب عبر الأصل:

صنف قطة من حيوان:
    دالة صوت():
        أعد "مياو"

صنف موظف من شخص:
    دالة إنشاء(اسم، راتب):
        الأصل.إنشاء(هذا، اسم)          # استدعاء منشئ الأب
        هذا.راتب = راتب
  • المنشئ هو الطريقة المسماة إنشاء وتُستدعى تلقائيًا عند إنشاء الكائن
  • الطرق والثوابت تُورّث تلقائيًا، ويمكن إعادة تعريفها في الصنف الابن
  • ثوابت الصنف تُعرّف مباشرة في جسمه وتُقرأ من الصنف أو الكائن

الخصائص المحسوبة (جديدة في 1.5) — قيم تُحسب عند الطلب وتُقرأ بلا أقواس:

صنف مستطيل:
    دالة إنشاء(العرض، الارتفاع):
        هذا.العرض = العرض
        هذا.الارتفاع = الارتفاع

    خاصية المساحة:
        أعد هذا.العرض * هذا.الارتفاع

م = مستطيل(٤، ٥)
اطبع(م.المساحة)                 # 20 — بلا أقواس، وتتحدث مع الحقول

تحميل العوامل (جديد في 1.5) — اجعل كائناتك تدعم العمليات عبر طرق خاصة:

الطريقة الخاصة تُستدعى عند مثال
اجمع(آخر) كائن + آخر أي عملية + أو انعكاسها ٥ + كائن
اطرح(آخر) كائن - آخر
اضرب(معامل) / اقسم / باقي / قوة * / / / % / **
يساوي(آخر) == و != مقارنة المحتوى بدل الهوية
أصغر_من / أكبر_من / أصغر_يساوي / أكبر_يساوي < > <= >= الترتيب المخصص
نص() اطبع(ك) و نص(ك) والنصوص المنسقة عرض مخصص للكائن
طول() طول(ك) طول الكائن
فهرس(م) / عيّن_فهرس(م، ق) ك[م] / ك[م] = ق فهرسة مخصصة
يحتوي(ق) ق في ك عضوية مخصصة
سالب() -ك النفي الأحادي
صنف نقطة:
    دالة إنشاء(س، ص):
        هذا.س = س
        هذا.ص = ص
    دالة اجمع(أخرى):
        أعد نقطة(هذا.س + أخرى.س، هذا.ص + أخرى.ص)
    دالة نص():
        أعد ق"({هذا.س}، {هذا.ص})"

اطبع(نقطة(١، ٢) + نقطة(٣، ٤))   # (4، 6)

عالمي / احذف (جديدتان في 1.5):

العداد = ٠
دالة زيّن():
    عالمي العداد                # التعيين يذهب للمتغير العام
    العداد += ١

ق = {"أ": ١، "ب": ٢}
احذف ق["أ"]                     # حذف مفتاح (أو عنصر قائمة أو متغير أو خاصية كائن)

المولدات (جديدة في 1.7) — دوال تنتج قيمًا تباعًا بكلمة أنتج:

دالة فيبوناتشي(الحد):
    أ = 0
    ب = 1
    لكل س في مدى(الحد):
        أنتج أ                # تُسلّم القيمة وتتوقف حتى الطلب التالي
        أ، ب = ب، أ + ب

# التكرار المباشر — والقيم تُنتج عند الطلب فقط
لكل قيمة في فيبوناتشي(8):
    اطبع(قيمة)

# استهلاك كامل أو تقدم يدوي
م = فيبوناتشي(10)
اطبع(قائمة(م))               # كل القيم مرة واحدة
اطبع(م.التالي())             # القيمة التالية يدويًا (خطأ عند النهاية)
  • المولد كسول: لا ينفذ شيئًا حتى أول طلب — مثالي للتسلسلات الضخمة أو اللانهائية
  • لكل يغلق المولد تلقائيًا عند كسر أو الخطأ (تنظيف مضمون)
  • تعمل مع خريطة ومرشّح واختزل وقائمة() واختر مباشرة
  • المولدات تعمل كطرق أصناف أيضًا: دالة اعد(): أنتج س

المزخرفات (جديدة في 1.7) — وسّع دوالك بعلامة @ قبل التعريف: (وفي 1.24 تعمل على غير متزامنة دالة أيضًا — المزخرف يستلم الدالة غير المتزامنة كما هي ويبقى استدعاؤها مهمة تنتظر بـ انتظر)

دالة محفوظ(د):
    ذاكرة = {}
    دالة مغلفة(س):
        لو س في ذاكرة:
            أعد ذاكرة[س]
        النتيجة = د(س)
        ذاكرة[س] = النتيجة
        أعد النتيجة
    أعد مغلفة

@محفوظ
دالة فيبوناتشي(ن):
    لو ن <= 1:
        أعد ن
    أعد فيبوناتشي(ن - 1) + فيبوناتشي(ن - 2)
  • يُطبق المزخرف الأقرب للدالة أولًا، ويمكن تكديس عدة مزخرفات
  • المزخرف قد يستقبل وسائط: @مزخرف(قيمة)
  • يعمل على طرق الأصناف أيضًا — وهذا يبقى متاحًا للدالة المغلفة

الوراثة المتعددة (جديدة في 1.7) — صنف يرث عدة أصناف بفواصل:

صنف طائر:
    دالة تحرك():
        أعد "يطير"

صنف سباح:
    دالة اسبح():
        أعد "يسبح"

صنف بطريق من طائر، سباح:
    دالة تعريف():
        أعد الأصل.تحرك() + " و" + الأصل.اسبح()   # الأصل = أول صنف
  • ترتيب حل الطرق C3 كما في بايثون: الأصل الأول أولًا، والتعارضات المعينية تُحل بلا غموض
  • الأصل.طريقة(...) تربط الكائن تلقائيًا — ويمكن تمرير هذا صراحة للتوافق مع الكود الأقدم
  • الوراثة الدائرية والترتيبات المتناقضة تُكشف برسائل عربية واضحة

الواجهات (جديدة في 1.8)

الواجهة عقد مجرد: تُعلن الطرق المطلوبة دون تنفيذها، والأصناف المنفذة تلتزم بتوفيرها. أي محاولة لإنشاء كائن من صنف لم ينفذ العقد كاملًا تفشل برسالة عربية واضحة:

واجهة شكل:
    دالة مساحة()          # طريقة مجردة — بلا جسم
    دالة محيط()          # يجب تنفيذها في كل صنف منفذ

    دالة وصف():          # تنفيذ افتراضي — يورثه كل منفذ
        أعد "مساحة: " + نص(هذا.مساحة())

صنف مربع من شكل:
    دالة إنشاء(ض):
        هذا.ض = ض
    دالة مساحة():
        أعد هذا.ض * هذا.ض
    دالة محيط():
        أعد ٤ * هذا.ض

م = مربع(٣)
اطبع(م.وصف())              # يستدعي المساحة المنفذة والوصف الموروث
  • الطريقة بلا جسم مجردة: لا يمكن إنشاء كائن من صنف لم ينفذها — ويُذكر كل ما ناقص
  • الطريقة بجسم تنفيذ افتراضي: يورثه المنفذون، ويمكن تجاوزه بإعادة تعريفه
  • الواجهة نفسها لا تُنشأ منها كائنات — هي عقد لا كود تشغيل
  • وراثة الواجهات: واجهة كامل من أساسي: تضيف التزامات جديدة، ويجب أن ترث الواجهات من واجهات فقط
  • ثوابت الواجهة: وحدات = "متر" تتاح لكل الأصناف المنفذة
  • التزامن مع الأصناف: صنف تطبيق من قاعدة، رسم — صنف عادي + واجهة في نفس الوقت
  • الصنف الوسيط قد ينفذ نصف العقد ويبقى مجردًا — ويكمل صنفه الابن الباقي

الوحدات الجاهزة

استورد رياضيات
اطبع(رياضيات.جذر(١٦))       # 4.0
اطبع(رياضيات.بي)             # 3.14159...

استورد وقت
وقت.نوم(١)                   # سكون ثانية
اطبع(وقت.زمن())              # الزمن الحالي بالثواني

وحدة ملفات

كتابة وقراءة الملفات النصية مباشرة:

ملفات.اكتب("ملاحظات.txt"، "سطر أول\n")   # يكتب فوق المحتوى
ملفات.أضف("ملاحظات.txt"، "سطر ثانٍ\n")   # يضيف إلى النهاية
اطبع(ملفات.اقرأ("ملاحظات.txt"))            # يقرأ المحتوى كاملًا
اطبع(ملفات.أسطر("ملاحظات.txt"))            # [سطر أول، سطر ثانٍ]
اطبع(ملفات.موجود("ملاحظات.txt"))           # صح
ملفات.احذف("ملاحظات.txt")                  # حذف الملف

وحدة جيسون

حفظ البيانات وتبادلها بصيغة JSON الشائعة — تحافظ على النصوص العربية:

طالب = {"الاسم": "نورة"، "العمر": ٢٥، "مواد": ["رياضيات"]}
نص_جيسون = جيسون.نص(طالب)              # حفظ بصيغة JSON
ملفات.اكتب("طالب.json"، نص_جيسون)

المعاد = جيسون.حلل(ملفات.اقرأ("طالب.json"))
اطبع(المعاد["الاسم"])                   # نورة
  • حلل يقبل JSON القياسي، ويتسامح مع الأرقام العربية ٢٥ والفاصلة ،
  • نص يرفع خطأً واضحًا إن حاولت تحويل قيمة غير قابلة للحفظ

وحدة عشوائية (جديدة في 1.5)

عشوائية.بذرة(٢٠٢٦)                    # نتائج قابلة للتكرار
عشوائية.صحيح(١، ١٠٠)                  # عدد صحيح عشوائي
عشوائية.عشري()                         # عدد بين ٠ و ١
عشوائية.اختيار(["أ"، "ب"])             # عنصر عشوائي
عشوائية.خلط(فريق)                      # نسخة مخلوطة (لا تعدل الأصل)
عشوائية.عينة(فريق، ٢)                  # عناصر عشوائية بلا تكرار

وحدة تنظيم — التعبيرات النمطية (جديدة في 1.5)

تنظيم.يجد("[٠-٩]+"، "عندي ٤٢ تفاحة")           # "٤٢" أو ولا شيء
تنظيم.كل_المطابقات("\\d+"، نص)                  # كل الأرقام قائمة
تنظيم.يستبدل("\\s+"، " "، نص)                    # استبدال بنمط
تنظيم.ينقسم("[،]"، نص)                          # تقسيم بنمط
تنظيم.يطابق("[٠-٩]+"، "١٢٣")                    # تطابق كامل؟ صح/خطأ
تنظيم.يبدأ("مرحبا"، نص)                         # يبدأ بالنمط؟

وحدة نظام (جديدة في 1.5)

نظام.النظام()                          # "Linux" / "Windows" / "Darwin"
نظام.مجلد_العمل()                      # المجلد الحالي
نظام.متغير("HOME"، "افتراضي")          # متغير بيئة مع قيمة بديلة
نظام.ملفات_في(".")                     # أسماء ملفات المجلد مرتبة
نظام.فصل("مجلد"، "ملف.عربي")           # دمج مسار بفواصل النظام
نظام.اسم_الملف(م) / نظام.المجلد(م)     # استخراج الأجزاء
نظام.انشاء_مجلد(م) / نظام.مجلد_موجود(م) # إنشاء وفحص المجلدات

وحدة شبكة (جديدة في 1.5)

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

استجابة = شبكة.اطلب("https://example.com")
لو استجابة["الحالة"] == ٢٠٠:
    اطبع(طول(استجابة["النص"]))

# طلب POST ببيانات — القاموس يُرسل تلقائيًا بصيغة JSON
ن = شبكة.اطلب("https://api.مثال.كوم"، "POST"، {}، {"الاسم": "سارة"}، ٥)

# أو اجلب النص مباشرة
صفحة = شبكة.نص_الصفحة("https://example.com")
  • أخطاء الاتصال ترفع خطأً عربيًا واضحًا (يمسكها جرب)
  • رموز الحالة غير السعيدة (٤٠٤ وغيرها) تعاد كناتج طبيعي ليقرر المستخدم
  • شبكة.تنزيل(رابط، مسار، مهلة؟) — تنزيل ملفات إلى القرص يعيد عدد البايتات (جديد في 1.15)

وحدة تحويل — الأرقام العربية (حصرية! جديدة في 1.5)

التفقيط: تحويل الأعداد إلى كلمات عربية صحيحة النحو — مفيد للفواتير والشيكات:

تحويل.كلمات(١٢٣٤)             # "ألف ومئتان وأربعة وثلاثون"
تحويل.كلمات(١٥٠٠٠٠)            # "مئة وخمسون ألف"
تحويل.كلمات(٢٠٢٦)              # "ألفان وستة وعشرون"
تحويل.كلمات(٠)                 # "صفر"
تحويل.كلمات(-٥)                # "سالب خمسة"

تحويل.إلى_شرقية("سنة 2026")    # "سنة ٢٠٢٦"
تحويل.إلى_غربية("سنة ٢٠٢٦")    # "سنة 2026"

يدعم الأعداد حتى ٩٩٩,٩٩٩,٩٩٩,٩٩٩ مع قواعد المثنى والجمع والأعداد المركبة.

توسيع رياضيات ووقت (جديد في 1.5)

رياضيات.مشترك_الأكبر(٤٨، ٣٦)   # 12
رياضيات.مشترك_الأصغر(٤، ٦)     # 12
رياضيات.علامة(-٩)              # -1
رياضيات.لوغاريتم_عشري(١٠٠٠)    # 3.0

الآن = وقت.الآن()               # قاموس: السنة، الشهر، يوم_الأسبوع…
اطبع(الآن["يوم_الأسبوع"])      # السبت
وقت.تنسيق("%ي/%ش/%س")          # 26/09/2026

الوحدات الخاصة (ملفات .عربي)

نظم مشروعك في ملفات متعددة واستوردها — ضع ملف هندسة.عربي بجانب برنامجك (أو في مجلد وحدات/):

# ملف: هندسة.عربي
ط = ٣.١٤

دالة مساحة_الدائرة(نق):
    أعد ط * نق * نق

ثم استورده بثلاث صيغ:

# ١) استيراد كامل — الوحدة كائن يحوي كل ما فيها
استورد هندسة
اطبع(هندسة.مساحة_الدائرة(٥))

# ٢) استيراد أسماء محددة
من هندسة استورد مساحة_الدائرة
اطبع(مساحة_الدائرة(٢))

# ٣) استيراد بمسار صريح
استورد "وحدات/هندسة.عربي"
  • الوحدة تُنفّذ مرة واحدة مهما تكرر الاستيراد (تخزين مؤقت)
  • الاستيراد الدائري (أ يستورد ب يستورد أ) يُكشف ويرفع خطأً واضحًا
  • داخل الوحدة تتوفر كل الجاهزات (اطبع، رياضيات، …)، ومتغيراتها معزولة عن البرنامج المستورد

وحدة اختبارات (جديدة في 1.6)

إطار اختبارات كامل داخل اللغة — اختبر دوالك وأصنافك واطبع تقريرًا واضحًا:

استورد اختبارات

دالة جمع(أ، ب):
    أعد أ + ب

اختبارات.ابدأ("اختبارات الحساب")
اختبارات.يساوي(جمع(٢، ٣)، ٥، "جمع عددين")     # ✓ جمع عددين
اختبارات.يختلف(١، ٢)                          # ✓ الاختبار رقم 2
اختبارات.يصح(طول("عربي") > ٠)                 # ✓ الاختبار رقم 3
اختبارات.يخطئ([])                             # ✓ الاختبار رقم 4
اختبارات.يرفع(دالة() => قسمة(٥، ٠)، "ترفع خطأ")
النتيجة = اختبارات.ملخص()   # يطبع: == الملخص: 5 ناجحة، 0 فاشلة من 5 اختبارًا ==
اطبع(النتيجة["فاشل"])       # ٠ — الملخص يعيد قاموسًا {المجموعة، ناجح، فاشل، الكل}
الدالة الوظيفة
ابدأ(اسم؟) يبدأ مجموعة اختبارات جديدة (يعيد ضبط العدادات)
يساوي(فعلي، متوقع، اسم؟) نجاح إذا تساوت القيمتان
يختلف(فعلي، متوقع، اسم؟) نجاح إذا اختلفات
يصح(قيمة، اسم؟) نجاح إذا كانت القيمة صحية
يخطئ(قيمة، اسم؟) نجاح إذا كانت القيمة خاطئة
يرفع(دالة، اسم؟) يستدعي الدالة ويؤكد أنها ترفع خطأ
ملخص() يطبع الملخص ويعيد {المجموعة، ناجح، فاشل، الكل}

وحدة خادم (جديدة في 1.6)

خوادم ويب حقيقية — اكتب خدمة كاملة بلغة عربي:

استورد خادم
استورد شبكة

دالة معالج(طلب):
    # الطلب: {الطريقة، المسار، المعاملات، الترويسات، النص}
    لو طلب["المسار"] == "/تحية":
        أعد {الحالة: 200، النص: ق"أهلا {طلب["المعاملات"]["الاسم"]}!"}
    أعد {الحالة: 404، النص: "غير موجودة"}

المنفذ = خادم.ابدأ(٨٠٨٠، معالج)   # يعيد المنفذ الفعلي
ر = شبكة.اطلب("http://127.0.0.1:8080/تحية؟الاسم=سارة")
اطبع(ر["النص"])                    # أهلا سارة!
خادم.قف()                          # يوقف الخادم
  • الاستجابة: نص صفحة مباشرة، أو قاموس {الحالة، النص، الترويسات} (الترويسات تدعم نوع_المحتوى والموقع وتخزين_مؤقت وكوكيز)
  • المنفذ() يعيد المنفذ الحالي، وانتظر() يبقي الخادم عاملًا حتى المقاطعة (Ctrl+C)
  • مسارات عربية بالكامل — العميل يفهم /تحية؟الاسم=سارة مباشرة

أدوات النظام البيئي (جديدة في 1.6)

python3 arabi.py --نسق ملف.عربي [ملفات…]   تنسيق الكود: إصلاح التبويب والإزاحة والمسافات
python3 arabi.py --افحص ملف.عربي [ملفات…]  كشف: المتغيرات غير المستخدمة، الكود غير
                                           القابل للوصول، الأسماء غير المعرفة،
                                           تظليل الجاهزات، المعاملات المكررة…
python3 arabi.py --وثق ملف.عربي [ناتج.md]  توليد توثيق Markdown من التوثيقات النصية
python3 arabi.py --ثبت مسار|رابط           تثبيت مكتبة في مجلد مكتبات/ (مع فحص الصلاحية)
python3 arabi.py --حزم                     عرض المكتبات المثبتة
python3 arabi.py --بايت ملف.عربي [ملفات…]  ترجمة إلى كود وسيط (.بيت) دون تنفيذ
python3 arabi.py --لا-بايت ملف.عربي        تشغيل معطّلًا الكود الوسيط (تجاهل الذاكرة)
python3 arabi.py --لا-دولاب ملف.عربي       تشغيل معطّلًا الدولاب الافتراضي (ممسح شجري)
  • المثبتة في مكتبات/ تُستورد بالاسم مباشرة: استورد مكتبتي
  • الفاحص يفهم دلالات الإغلاق في عربي (الإسناد يعدّل النطاق الخارجي) فلا يطلق إنذارات كاذبة
  • مولد التوثيق يستخرج النصوص التوثيقية (أول نص داخل دالة/صنف) مع الدوال والأصناف والتعدادات والاعتماديات

وحدة قاعدة (جديدة في 1.7)

قواعد بيانات SQLite كاملة من داخل اللغة — بلا أي إعداد:

استورد قاعدة

ق = قاعدة.افتح("مكتبتي.db")    # أو قاعدة.افتح() لقاعدة في الذاكرة
ق.نفذ("CREATE TABLE كتب (العنوان TEXT, السعر REAL)")
ق.نفذ("INSERT INTO كتب VALUES (?, ?)", ["البخلاء", 30])   # معاملات آمنة من الحقن

لكل صف في ق.استعلم("SELECT العنوان, السعر FROM كتب WHERE السعر > ?", [20]):
    اطبع(صف[0] + " بسعر " + نص(صف[1]))

اطبع(ق.أعمدة("SELECT * FROM كتب"))   # أسماء الأعمدة
ق.أغلق()
الدالة الوظيفة
افتح(مسار؟) يفتح قاعدة ملف أو قاعدة في الذاكرة، ويعيد اتصالًا
نفذ(اتصال، استعلام، معاملات؟) ينفذ أمرًا ويعيد عدد الصفوف المتأثرة
استعلم(اتصال، استعلام، معاملات؟) يعيد صفوف النتائج قوائم
أعمدة(اتصال، استعلام، معاملات؟) يعيد أسماء أعمدة النتائج
أغلق(اتصال) يغلق الاتصال
  • التنفيذ تلقائي الحفظ — لا حاجة لأمر حفظ (COMMIT)
  • المعاملات ? تحميك من حقن SQL — مررها كقائمة
  • الاتصال يدعم الطرق مباشرة: ق.نفذ(...) أو عبر الوحدة: قاعدة.نفذ(ق، ...)

وحدة ترميز (جديدة في 1.7)

ترميز Base64 والبصمات التشفيرية:

استورد ترميز

م = ترميز.شفّر64("مرحبا")        # Base64 للنصوص العربية
اطبع(ترميز.فك64(م))               # مرحبا

اطبع(ترميز.هش256("كلمة السر"))    # بصمة SHA-256 سداسية (64 حرفًا)
اطبع(ترميز.هش1("كلمة السر"))      # SHA-1
اطبع(ترميز.ام_دي_5("abc"))        # MD5

وحدة جداول (جديدة في 1.7)

قراءة وكتابة ملفات CSV — مثالية مع قواعد البيانات:

استورد جداول

# كتابة صفوف القوائم في ملف
جداول.اكتب("بيانات.csv"، [["الاسم"، "العمر"]، ["سارة"، 30]])

# قراءة الملف
صفوف = جداول.اقرأ("بيانات.csv")

# تحويل نص إلى صفوف والعكس — بفاصل مخصص إن أردت
صفوف = جداول.حلل("أ؛ب"، "؛")
ن = جداول.نص([[1، 2]، [3، 4]])
  • الخلايا تحفظ الأعداد والنصوص وصح/خطأ، وتُقرأ نصوصًا (مواصفة CSV القياسية)
  • الخلايا المحتوية على الفاصل تُقتبس تلقائيًا وفق المواصفة

وحدة خيوط (جديدة في 1.8)

تنفيذ متوازي بذاكرة مشتركة — شغّل دوال عربية في خيوط مستقلة وانتظر نتائجها:

دالة تحليل(اسم، ثوان):
    وقت.نوم(٠.٠٥ * ثوان)
    أعد اسم + " اكتمل"

خ١ = خيوط.شغّل(تحليل، "أ"، ٢)      # يبدأ فورًا ولا يحجب
خ٢ = خيوط.شغّل(تحليل، "ب"، ٣)
اطبع(خ١.نتيجة())                # تنتظر وتعيد القيمة (أو ترفع خطأ الخيط)
اطبع(خيوط.انتظر_الكل([خ١، خ٢]))   # تنتظر دفعة كاملة وتعيد قائمة النتائج
العضو الوظيفة
خيوط.شغّل(د، وسائط...) يشغل الدالة في خيط مستقل ويعيد خيطًا
خيوط.انتظر_الكل(قائمة) ينتظر كل الخيوط ويعيد قائمة النتائج
خيوط.قفل() قفل حصر لحماية البيانات المشتركة
خيوط.طابور() طابور آمن لتمرير الرسائل بين الخيوط
خيوط.معالجات() عدد أنوية المعالج

طرق الخيط: نتيجة() (تنتظر وتعيد النتيجة وتعيد رفع أخطاء الدالة)، انتظر() (تنتظر بلا إعادة)، حي() (هل ما زال يعمل؟)

طرق القفل: احجز(مهلة؟) (يحجز ويعيد صح، أو خطأ عند انتهاء المهلة)، افرح() (يفتح)، محاولة() (يحجز إن أمكن دون انتظار)

طرق الطابور: أرسل(قيمة)، استلم() (ينتظر رسالة)، استلم_الآن() (يرفع خطأ إن كان فارغًا)، الحجم()، فارغ()

نمط العداد الآمن — القفل يجعل الزيادة ذرية بلا سباقات:

العداد = ٠
الحارس = خيوط.قفل()

دالة زد(مرات):
    عالمي العداد
    تم = ٠
    طالما تم < مرات:
        الحارس.احجز()
        العداد += ١
        الحارس.افرح()
        تم += ١

وحدة تواريخ (جديدة في 1.9)

إدارة التواريخ والأوقات بأسماء أيام أسبوع عربية:

استورد تواريخ

اليوم = تواريخ.أنشئ(٢٠٢٦، ٩، ٢٧، ١٠، ٣٠)
اطبع(اليوم)                              # 2026-09-27 10:30:00
اطبع(اليوم.يوم_الأسبوع())                 # الأحد
اطبع(اليوم.نسق("يوم %d من شهر %m"))      # يوم 27 من شهر 09

مقروء = تواريخ.حلل("2026-12-01"، "%Y-%m-%d")
غدًا = تواريخ.أضف(اليوم، ١)              # أضف(ت، أيام، ساعات، دقائق، ثواني)
العضو الوظيفة
تواريخ.الآن() التاريخ والوقت الحاليان
تواريخ.أنشئ(سنة، شهر، يوم، ساعة=٠، دقيقة=٠، ثانية=٠) تاريخ من أرقام
تواريخ.حلل(نص، صيغة) قراءة تاريخ من نص حسب صيغة مثل %Y-%m-%d
تواريخ.فرق(أ، ب) الفرق بالأيام (سالب إن كان ب بعدها)
تواريخ.أضف(ت، أيام، ساعات، دقائق، ثواني) تاريخ جديد بعد الإضافة
تواريخ.يوم_الأسبوع(ت) اسم اليوم بالعربية (الاثنين…الأحد)

طرق التاريخ: السنة الشهر اليوم الساعة الدقيقة الثانية (تُقرأ بلا أقواس)، يوم_الأسبوع()، نسق(صيغة)

وتتكامل مع مطابقة الأنماط — منطق تقويم أنيق:

طابق تاريخ.يوم_الأسبوع()
حالة "الخميس" أو "الجمعة" أو "السبت":
    اطبع("عطلة نهاية الأسبوع")
حالة _:
    اطبع("يوم عمل")

بروتوكول التكرار المخصص (جديد في 1.10)

أي صنف يعرّف طريقة تالٍ() يصبح قابلًا للتكرار بـلكل — عودة ولا شيء تنهي التكرار. وإذا عرّف أول() فستُستدعى في بداية كل دورة للحصول على مؤشر جديد، فيمكن التكرار على نفس الكائن أكثر من مرة:

صنف عداد:
    دالة إنشاء(من، إلى):
        هذا.الحالي = من
        هذا.النهاية = إلى
    دالة تالٍ():
        لو هذا.الحالي > هذا.النهاية:
            أعد ولا شيء          # إشارة الانتهاء
        القيمة = هذا.الحالي
        هذا.الحالي = هذا.الحالي + 1
        أعد القيمة

لكل س في عداد(١، ٥):
    اطبع(س)                      # ١ ٢ ٣ ٤ ٥

اطبع(٣ في عداد(١، ٥))            # صح — عامل في يمر على العناصر
اطبع([...عداد(١، ٤)])            # نشر العناصر في قائمة
الطريقة دورها
تالٍ() تعيد القيمة التالية، وعودة ولا شيء تنهي التكرار (مطلوبة)
أول() تعيد كائن المؤشر في بداية كل دورة (اختيارية) — الافتراضي الكائن نفسه

يعمل البروتوكول مع لكل (مع كسر واستمر والتفكيك لكل أ، ب في) ومع عامل في (إن لم يعرّف الكائن يحتوي) ومع النشر ... في القوائم والاستدعاءات، ويرثه الأصناف الأبناء ويمكنهم إعادة تعريفه.

وحدة إحصاء (جديدة في 1.10)

تحليل وصفي جاهز لقوائم الأعداد:

من إحصاء استورد معدل، وسيط، منوال، انحراف

درجات = [٨٥، ٩٢، ٧٨، ٩٢، ٦٥]
اطبع(معدل(درجات))      # المتوسط الحسابي
اطبع(وسيط(درجات))      # القيمة الوسطى بعد الترتيب
اطبع(منوال(درجات))     # الأكثر تكرارًا (الأولى ظهورًا عند التعادل)
اطبع(انحراف(درجات))    # الجذر التربيعي للتباين المجتمعي
العضو الوظيفة
معدل(ق) المتوسط الحسابي
وسيط(ق) القيمة الوسطى (متوسط العددين الوسطيين للقوائم الزوجية)
منوال(ق) القيمة الأكثر تكرارًا
تباين(ق) التباين المجتمعي (القسمة على العدد)
انحراف(ق) الانحراف المعياري
مدى(ق) الفرق بين أكبر قيمة وأصغرها

كلها ترفع خطأ عربيًا واضحًا عند تمرير قائمة فارغة أو غير عددية.

خادم اللغة LSP (جديد في 1.10)

خادم بروتوكول خادم اللغة الكامل يوفر تجربة تحرير حية لأي محرر يدعم LSP (VS Code وNeovim وغيرهما):

python3 arabi.py --لغة     # يخدم القنوات القياسية (stdin/stdout)
الميزة ما يوفره
تشخيص لحظي أخطاء الصياغة وتحذيرات الفاحص تظهر أثناء الكتابة
إكمال تلقائي كلمات محجوزة، جاهزات، أعضاء الوحدات والأصناف، أسماء الملف، مقتطفات
استدلال الأصناف بعد متغير. يستدل صنف المتغير من إسناده فيعرض طرقه
تلميح عند التعليق تواقيع الدوال مع توثيقها وأعضاء الوحدات
رموز المستند الدوال والأصناف والواجهات والتعدادات وطرقها في شريط التنقل
الانتقال إلى التعريف F12 ينقلك إلى تعريف الدالة أو الطريقة داخل الملف

الخادم لا يشغل كود المستخدم أبدًا — التحليل والفحص فقط، فهو آمن تمامًا.

فهم القوائم والقواميس (جديد في 1.11)

بناء متتاليات في سطر واحد — أقوى من خريطة ومرشّح مجتمعتين:

[س * س لكل س في مدى(10)]                    # تحويل: [0، 1، 4، 9، …، 81]
[س لكل س في أعداد إن س % 2 == 0]            # ترشيح بشرط
[س * 1.1 لكل س في المبيعات إن س > 100]      # تحويل وترشيح معًا
[أ + ب لكل أ، ب في نقاط]                    # تفكيك الأزواج
[أ * ب لكل أ في ص لكل ب في ع]               # عبارات لكل متتالية (ضرب ديكارتي)
{ن: طول(ن) لكل ن في أسماء}                  # فهم قاموس — المفتاح المتغير يُحسب كل دورة
{"الحد": س لكل س في القيم}                  # مفتاح ثابت: اقتبسه — وآخر قيمة تغلب
[[صف[ع] لكل صف في مصفوفة] لكل ع في مدى(3)]  # فهم متداخل: نقل مصفوفة

القواعد:

البند الدلالة
المتتاليات قوائم ونصوص ومدى وقواميس (تعطي مفاتيحها) ومولدات وأي صنف يعرّف تالٍ
الشرط إن اختياري لكل عبارة — يرشّح قبل الوصول للعنصر التالي
التفكيك لكل أ، ب في أزواج يفكك كل عنصر على هدفين أو أكثر
النطاق نطاق مستقل: متغيرات العبارات لا تسرّب للخارج ولا تخترق متغيرات بنفس الاسم
المفاتيح المجرّدة في فهم القاموس {ن: …} المفتاح متغير — ولتثبيته اقتبسه "ن"

الكود الوسيط Bytecode (جديد في 1.11)

تحليل المصدر أبطأ مرحلة عند تشغيل البرامج الكبيرة ومشاريع الوحدات المتعددة. عربي الآن يترجم شجرة البرنامج إلى كود وسيط مخزن ويحمّله فورًا في التشغيلات التالية:

برنامج.عربي  ← يُحلل مرة واحدة →  __بايت__/برنامج.بيت  ← يُحمّل فورًا بعد ذلك
  • تلقائي بلا إعداد: التشغيل العادي يكتب الذاكرة عند غيابها ويستخدمها عند صلاحيتها — للبرنامج الرئيسي وكل وحدة .عربي مستوردة
  • تسريع حقيقي: القياس على ملف من 2000 سطر — 20 مللي ثانية من الذاكرة مقابل 136 مللي ثانية تحليلًا كاملًا (نحو ٧ أضعاف)، والفارق يتسع مع كِبَر المشروع
  • إبطال ذكي: أي تعديل على المصدر (حجمًا أو زمن تعديل) أو تغيّر إصدار اللغة يعيد الترجمة تلقائيًا — لا تحديثات يدوية ولا مخاطر قِدَم
  • أمان الدوران: ذاكرة تالفة أو ناقصة تُتجاهل بأمان وتُعاد الترجمة من المصدر، والكتابة ذرية عبر ملف مؤقت ثم استبدال
python3 arabi.py برنامج.عربي        # أول تشغيل: ترجمة + تشغيل (تُكتب الذاكرة)
python3 arabi.py برنامج.عربي        # التشغيلات التالية: تحميل فوري من الذاكرة
python3 arabi.py --بايت برنامج.عربي # ترجمة فقط دون تنفيذ (يفيد التوزيع والتحقق)
python3 arabi.py --لا-بايت برنامج.عربي  # تشغيل متجاوزًا الذاكرة تمامًا
python3 arabi.py --لا-دولاب برنامج.عربي # تنفيذ شجري خالص بلا دولاب افتراضي

مجلد __بايت__/ وملفات .بيت مُتجاهَلان في .gitignore تلقائيًا — مثل __pycache__ في بايثون، أضِفهما إلى .gitignore في مشروعك إن وزّعت الكود.

سجل الحزم وبيئة المشروع (1.12، وبيئة المشروع 1.28)

نظام إدارة حزم كامل بالعربية: فهرس مركزي، نسخ دلالية، تبعيات تُحل تلقائيًا، ملف قفل، وبيان مشروع هو مصدر الحقيقة:

python3 arabi.py حزمة إنشاء [اسم]        # هيكل مشروع جديد: بيان + مدخل نموذجي
python3 arabi.py حزمة تثبيت اسم_الحزمة   # تثبيت من السجل — ويُسجّل التبعية في البيان
python3 arabi.py حزمة تثبيت اسم>=1.0     # قيد صريح يُسجّل كما هو
python3 arabi.py حزمة تثبيت              # تثبيت تبعيات المشروع من بيان حزمة.json
python3 arabi.py حزمة مزامنة             # موازنة البيئة مع البيان: الناقص يثبت والمخالف يستبدل
python3 arabi.py حزمة ترقيات             # ما له نسخة أحدث في السجل
python3 arabi.py حزمة فحص                # سلامة القفل والبيان وحزم/ — رمز خروج 1 عند الانحراف
python3 arabi.py حزمة قائمة              # الحزم المثبتة ونسخها وتبعياتها
python3 arabi.py حزمة بحث كلمة           # البحث في الفهرس بالاسم أو الوصف
python3 arabi.py حزمة إزالة اسم          # إزالة (ومحو التبعية من البيان)
python3 arabi.py حزمة تحديث [اسم]        # التحديث إلى أحدث نسخة — ويصحّح القيد عند المخالفة فقط

دورة العمل الكاملة: إنشاء مشروعك ← تثبيت بالاسم فيُسجّل في البيان ← شارك المجلد في git ← زملاؤك يكتفون بأمر تثبيت بلا هدف فيحصلوا على التبعيات نفسها، وفحص يخبرهم فورًا إن خالفت بيئتهم المحلية ما يوعد به البيان.

بنية المشروع بعد التثبيت:

مشروعك/
├── حزمة.json            بيان مشروعك (اختياري): الاسم والنسخة والتبعيات
├── قفل.json             قفل التثبيت: النسخ المثبتة بالضبط (مثل package-lock.json)
└── حزم/                 الحزم المثبتة (مثل node_modules)
    └── اسم_الحزمة/
        ├── حزمة.json    بيان الحزمة: الاسم والنسخة والمدخل والتبعيات
        └── الكود.عربي    ملف المدخل (الاسم.عربي افتراضيًا أو حقل المدخل)

الاستيراد تلقائي بعد التثبيت — المفسّر يبحث في حزم/ بعد مجلد البرنامج ووحدات/ ومكتبات/:

استورد ادوات_نص
من احصاء_متقدم استورد تقرير

قيود النسخ المتعرفة في التبعيات:

القيد المعنى
"1.2.3" تطابق تام
">=1.0" / ">1.0" / "<=1.0" / "<1.0" مقارنات معتادة (الناقص يُكمل بصفر)
"^1.2.3" متوافق مع الرتبة الكبرى: من 1.2.3 حتى أقل من 2.0.0 (و^0.2.3 حتى أقل من 0.3.0)
"~1.2.3" ترقيعات فقط: من 1.2.3 حتى أقل من 1.3.0
"*" أي نسخة

فهرس السجل ملف JSON بسيط. مصدره الافتراضي مستودع arabi-registry على GitHub، ويُستبدل بمتغير البيئة عربي_الفهرس أو العلم --الفهرس (ويدعم المسارات المحلية فيعمل النظام كاملًا بلا شبكة):

{
  "ادوات_نص": {"النسخة": "1.4.0", "الوصف": "أدوات معالجة النصوص",
               "المصدر": "مجلد ببيان أو ملف .عربي أو .zip أو رابط"},
  "احصاء_متقدم": {"النسخة": "2.1.0", "الوصف": "حسابات إحصائية",
                  "المصدر": "https://example.com/احصاء_متقدم.zip"}
}

أمان التثبيت: كل ملف .عربي في الحزمة يُفحص نحويًا قبل الكتابة، واسم الحزمة يجب أن يكون معرفًا قابلًا للاستيراد، واسم المصدر في الفهرس يجب أن يطابق بيان الحزمة، والتبعيات الدائرية تُكشف وتُرفض برسالة تُظهر السلسلة.

الدولاب الافتراضي (جديد في 1.13)

الكود الوسيط في 1.11 سرّع التحميل (تجاوز التحليل اللفظي والنحوي)، والدولاب الافتراضي في 1.13 يسرّع التنفيذ نفسه: عند أول استدعاء لدالة تُترجم أجسامها إلى تعليمات بايت-كود تنفذها حلقة واحدة سريعة بدل المرور الشجري على العقد (استدعاء طريقة لكل عقدة). الترجمة تُخزن على الدالة نفسها فتُدفع مرة واحدة:

دالة مجموع_حتى(ن):
    مج = 0
    س = 1
    طالما س <= ن:
        مج = مج + س
        س = س + 1
    أعد مج
البرنامج القياسي الممسح الشجري الدولاب الافتراضي التسريع
حلقة طالما حسابية (٢٠٠ ألف دورة) 1456 مللي ثانية 515 مللي ثانية 2.83×
تعاود فيبوناتشي(٢١) (٥٧ ألف استدعاء) 325 مللي ثانية 159 مللي ثانية 2.04×
فرز فقاعي (٣٠ عنصرًا) 5.4 مللي ثانية 3.4 مللي ثانية 1.58×
استدعاءات طرق أصناف كثيفة (٣٠ ألفًا) 331 مللي ثانية 252 مللي ثانية 1.32×

القياس ببايثون 3.12 (أفضل خمس تشغيلات) — والنتائج تتغير بحسب جهازك لكن النسب تبقى في نطاقها.

كيف يضمن الدولاب تطابق الدلالات؟ بالاحتياط الشفاف — الترجمة لا تفشل أبدًا لأنها تغلف ما لا تدعمه:

  • الجمل السريعة تترجم إلى تعليمات صريحة: التعبير، الإسناد (بما فيه الفهرسة والخصائص والمركّب)، لو/وإلا إذا/وإلا، طالما، لكل (القوائم والقواميس والنصوص والمدى)، أعد/كسر/استمر/تجاهل.
  • التعبيرات السريعة: الحرفيات، الأسماء، العمليات (بقيم و/أو القصيرة والثلاثي)، الاستدعاءات الموضعية، الفهرسة، الطرق والخصائص، القوائم والقواميس، النصوص المنسقة.
  • كل ما عدا ذلك (جرب، بدّل، طابق، صنف، استورد، فهم، سهمية، تقطيع، مولدات...) يُغلّف بتعليمة احتياطية تنفذها المسارات الأصلية نفسها في المفسّر — فتظهر الأخطاء بنصوصها وأرقام أسطرها المعتادة تمامًا.
  • كسر/استمر العابرة من جمل احتياطية (ككسر داخل بدّل داخل حلقة) تُمسك وتوجَّه للحلقة الأعمق كما لو نفذها الممسح.
  • ٢٩ تعليمة فقط، والعمليات الحسابية على الأعداد الخالصة لها مسار فوري متطابق مع دلالات _binop (القسمة والباقي والأس لها قواعد خاصة فلا تُسرّع أبدًا).

وعلم --لا-دولاب يعطّل الترجمة كليًا (ممسح شجري خالص) للمقارنة أو التشخيص:

python3 arabi.py examples/36_الدولاب_الافتراضي.عربي        # بالدولاب (افتراضي)
python3 arabi.py --لا-دولاب examples/36_الدولاب_الافتراضي.عربي  # بلا دولاب

والضمانة العملية: كل الاختبارات الـ1214 والأمثلة تنفذ بالوضعين وتُقارن مخرجاتها حرفيًا في اختبارات التكافؤ — اختلاف حرف واحد يُفشل الاختبار.

الملف التنفيذي المستقل (جديد في 1.14)

منذ الإصدار 1.14 يوزّع المفسّر ملفًا تنفيذيًا واحدًا اسمه عربي — يحمل داخله كل شيء: المحلل اللفظي والنحوي، المفسر والدولاب الافتراضي، الوحدات الثماني عشر، مدير الحزم، أدوات --نسق/--افحص/--وثق، خادم اللغة، وREPL. يعمل على أي جهاز بنفس نظام التشغيل بلا بايثون نهائيًا، ويظهر في --نسخة وصف «تنفيذي مستقل»:

$ ./عربي --نسخة
عربي — الإصدار 1.14.0 — تنفيذي مستقل

$ ./عربي -c 'اطبع("مرحبا من تنفيذي بلا بايثون!")'
مرحبا من تنفيذي بلا بايثون!

كل الأدوات تعمل عبره كما تعمل عبر المصدر:

./عربي برنامج.عربي          تشغيل برنامج (بالكود الوسيط والدولاب الافتراضي كاملين)
./عربي                      المفسر التفاعلي REPL
./عربي -c "كود"             تنفيذ كود مباشر
./عربي --تحقق ملف.عربي      فحص الصياغة
./عربي حزمة تثبيت اسم       مدير الحزم كاملًا (تثبيت/إزالة/قائمة/بحث/تحديث)
./عربي --لغة                خادم اللغة LSP للمحررات
./عربي --عامل المضيف:منفذ [--مفتاح سر]  عامل موزع يخدم مهام موزع (1.18) ويوقع التحدي بالمفتاح (1.19)
./عربي --نسق/--افحص/--وثق   أدوات النظام البيئي

البناء من المصدر على أي نظام يملك بايثون:

python3 -m pip install pyinstaller
scripts/بناء_التنفيذي.sh        # أو: python3 -m PyInstaller عربي.spec --noconfirm --clean

الناتج في dist/عربي (نحو ١٢ ميغابايت على لينكس). ملف المواصفة عربي.spec يستثني الوحدات الرسومية غير المستخدمة لتقليص الحجم، وسكربت البناء يفحص الناتج فورًا (--نسخة + كود تجريبي) للتأكد من سلامته. وملاحظتان مهمتان:

  • الثنائي مرتبط بنظام التشغيل ومعماريته: لبناء نسخة ويندوز أو ماك شغّل السكربت نفسه على ذلك النظام — المصدر نفسه يعمل في كل مكان.
  • ذاكرة الكود الوسيط والعالميات تعمل كما هي: التنفيذي يكتب __بايت__/ ويقرأ الحزم من حزم/ نسبةً إلى مجلد البرنامج المُشغَّل، لا نسبةً إلى موضع التنفيذي.

غير المتزامن (جديد في 1.15)

الدالة غير المتزامنة تعمل في خيط مستقل فور استدعائها، ويعيد الاستدعاء قيمة مهمة — فتُطلق عدة أعمال معًا ثم تنتظر ما تشاء:

غير متزامنة دالة جلب_الصفحة(الرابط):
    استجابة = شبكة.اطلب(الرابط)
    أعد استجابة["النص"]

م١ = جلب_الصفحة("https://example.com")   # بدأت فورًا
م٢ = جلب_الصفحة("https://example.org")  # وهذه معها بالتوازي

نصوص = انتظر_الجميع([م١، م٢])            # ينتظر الاثنين ويعيد النتائج بترتيبها
فائز = سباق([م١، م٢])                    # أول من ينتهي (البقية تواصل في الخلفية)
اطبع(انتظر فائز)                          # «انتظر» توقف السطر حتى تنتهي المهمة

قواعد النموذج:

  • تعريف: غير متزامنة دالة الاسم(...): — تعمل كدالة عادية في كل شيء: الافتراضيات، المعاملات بالاسم، ...المتغير، الإغلاق، والطرق داخل الأصناف.
  • الاستدعاء يعيد مهمة ولا ينتظر: أطلق الأعمال أولًا ثم انتظر ما تشاء، ومتى فشلت مهمة رُفع خطأها بكائنه الأصلي فتمسكه جرب كما لو حدث في السطر نفسه.
  • طرق المهمة: جاهز() فحص فوري بلا انتظار، نتيجة() ينتظر ويعيد، الخطأ() يعيد رسالة الفشل بعد الانتهاء أو ولا شيء، وانتظر() ينتظر بلا نتيجة.
  • انتظر_زمن(ثوان): نوم داخل المهمة يوقفها هي وحدها — بقية المهام تجري.
  • كلمة سياقية لا تكسر شيئًا: انتظر تظل اسمًا صالحًا، وطرق مثل خيط.انتظر() وخادم.انتظر() كما هي، و«انتظر» تعمل على خيوط وحدة خيوط أيضًا.

تنزيل الملفات (جديد في 1.15)

عدد_البايتات = شبكة.تنزيل("https://example.com/صورة.png"، "صورة.png")
  • تنزيل ثنائي آمن يعيد عدد البايتات المكتوبة، مع مهلة اختيارية (١٠ ثوان افتراضيًا)
  • أخطاء الشبكة ورموز الحالة وكتابة الملف ترفع رسائل عربية واضحة يمسكها جرب
  • مع غير المتزامن: تنزيلات متوازية بسطرين — م١ = انزل(رابط١) وم٢ = انزل(رابط٢) ثم انتظر_الجميع([م١، م٢])

تجمع الخيوط (جديد في 1.16)

غير المتزامن يفتح خيطًا لكل مهمة — ممتاز للتوازي، لكن لو قدمت مئات الأعمال دفعة واحدة فتح مئات الخيوط. التجمع يحل المشكلة: عدد ثابت من الخيوط العاملة يُعاد استخدامه، فتُقدَّم كل الأعمال وتُنفذ بترتيبها بحد أقصى من التزامن تحدده أنت:

تج = تجمع(٤)                        # أربعة خيوط عاملة تعاد استخدامها
مهام = []
لكل صورة في القائمة:
    مهام.أضف(تج.قدّم(عالج، صورة))    # تُربك لحظة التقديم وتُنفذ عند انفضّ خيط

نتائج = انتظر_الجميع(مهام)           # النتائج بترتيب التقديم كالمعتاد
تج.إنهاء()                           # توقف قبول الجديد وتنتظر تصفية كل المقدَّم

قواعد التجمع:

  • قدّم(دالة، معاملات...) تعيد مهمة (مهمة.نتيجة() وجاهز() والخطأ() كما في غير المتزامن تمامًا) — تقبل الدوال العادية والسهمية وغير المتزامنة والطرق المرتبطة بالكائنات وحتى الدوال الجاهزة، مع دعم كلمات المفاتيح: تج.قدّم(يرحب، "سالم"، لقب = "مهندس")
  • حد التزامن محفوظ تلقائيًا: ست مهام على تجمع من خيطين؟ لن تعمل أكثر من مهمتين معًا أبدًا — وقياس ذلك داخل اللغة على المثال 38
  • إنهاء() مزدوجة الأمان: تكمل كل المهام المقدَّمة قبل الخروج، والاستدعاء بعدها يرفع خطأً عربيًا واضحًا — واستدعاؤها من داخل مهمة على التجمع نفسه لا يعلّق
  • حجم() تعيد عدد الخيوط العاملة، ونوع(تج) تعيد «تجمع خيوط»
  • تكافؤ كامل مع الدولاب الافتراضي — التجمع يعمل بالوضعين بنفس الدلالات والأخطاء

التوزيع عبر pip (جديد في 1.16)

اللغة الآن حزمة بايثون قياسية:

# من PyPI (عند نشرها) أو مباشرة من المستودع:
pip install git+https://github.com/CTO-DRS/arabi-lang.git
# أو من نسخة محلية:
git clone https://github.com/CTO-DRS/arabi-lang && cd arabi-lang
pip install .

# بعدها أصبح عندك أمرٌ جاهز:
arabi examples/01_مرحبا_بالعالم.عربي
arabi                              # المفسر التفاعلي (REPL)
arabi حزمة قائمة                   # كل أدوات مدير الحزم كما هي

# وبدون أي أمر إضافي، تعمل الوحدة مباشرة:
python -m arabi --نسخة
  • الحزمة بلا أي تبعيات خارجية — بايثون 3.8+ يكفي، والتعريف arabi = "arabi:main" ينشئ الأمر arabi تلقائيًا
  • كل أدوات اللغة تعمل من النسخة المثبتة نفسها: --افحص و--نسق و--وثق و--بايت و--لغة ومدير الحزم
  • سير الإصدارات الآلي (.github/workflow-templates/release.yml): عند تفعيله ودفعه وسم v* يبني التنفيذي المستقل على لينكس وويندوز وماك وينشره في إصدار GitHub، ويبني sdist وwheel للتوزيع — والنشر إلى PyPI متاح بأمر يدوي واحد (يتطلب سر PYPI_API_TOKEN). ملاحظة: GitHub يمنع دفع ملفات .github/workflows/ إلا بتوكن يحمل صلاحية workflow — لذا السير مخزّن جاهزًا في .github/workflow-templates/ ويُفعَّل بنقله إلى .github/workflows/release.yml أو بإنشائه من واجهة GitHub (Add file) بلصق محتواه.

توازي العمليات (جديد في 1.17)

الخيوط تشارك الذاكرة لكنها تخضع لقفل التفسير العالمي (GIL) — عمل حسابي خالص لا يتوازى بينها. وحدة عمليات تحل المشكلة من جذورها: كل عمل يعمل في معالج مستقل بمفسّره الخاص وذاكرته المعزولة، فتُستهلك كل أنوية المعالج فعلًا:

من عمليات استورد شغّل، تجمع، معالجات

دالة مجموع_مربعات(ن):
    م = ٠
    لكل س في مدى(ن):
        م = م + س * س
    أعد م

# عمل واحد في عملية منفصلة — انتظار بكلمة 'انتظر' المعروفة:
ع = شغّل(مجموع_مربعات، ٢٠٠٠٠٠)
اطبع(انتظر ع)

# تجمع عمليات يوزع المهام على الأنوية ويعيد النتائج بترتيب التقديم:
تج = تجمع(معالجات())
مهام = []
لكل حجم في [١٠٠٠٠٠، ٢٠٠٠٠٠، ٣٠٠٠٠٠]:
    مهام.أضف(تج.قدّم(مجموع_مربعات، حجم))
اطبع(انتظر_الجميع(مهام))
تج.إنهاء()
  • ما الذي يعبر حدود العملية؟ الأعداد والنصوص والقوائم والقواميس، والدوال العربية بجسمها وترويستها وإغلاقها (حتى التعاود عبر الاسم العالمي ونمط المصنع بالإغلاق الذاتي)، والأصناف بوراثتها وثوابتها، والكائنات بحقولها فتعود بطرقها الصالحة، والتعدادات، والأخطاء المخصصة بهويتها فتصلك جرب/باستثناء بصنفها الصحيح
  • ما الذي لا يعبر؟ الكائنات الحية المرتبطة بخيوط المفسّر (الخيوط والمهام والأقفال والطوابير والمولدات والتواريخ واتصالات قواعد البيانات) — تُرفض برسالة عربية واضحة لحظة التقديم لا بعد فوات الأوان، والعملية الابن تبني مفسّرًا كاملًا بوحداته الثماني عشر فتجد الدالة كل الجاهزات
  • طرق العملية: نتيجة() والخطأ() وجاهز() وانتظر() ومعرف() (معرف نظام التشغيل — يقارنه بـعمليات.معرفي() لتتأكد أن العمل انفصل فعلًا)، وطرق مهمة التجمع نفسها بدون معرف
  • مهلة أمان ١٢٠ ثانية لانتظار النتيجة، والتنفيذ عبر multiprocessing بنمط spawn موحدًا على لينكس وويندوز وماك — آمن مع خيوط المفسّر ولا يتأثر بنمط النظام

الحوسبة الموزعة (جديد في 1.18)

المعالجات المنفصلة تجاوزت حدود العملية الواحدة — وحدة موزعة تتجاوز حدود الجهاز نفسه: موزع مركزي يستقبل اتصالات العمالة من أي جهاز في الشبكة، وكل مهمة تنفذ في العامل البعيد بمفسّر كامل، والنتيجة تعود للنادل مهما نُفذ عملها:

من خيوط استورد شغّل
من موزعة استورد موزع، عامل

# على جهاز الموزع:
م = موزع(7700)                     # وبدون منفذ = 7700 افتراضيًا، والصفر اختيار تلقائي

# كل عامل على أي جهاز (خيط هنا — أو على أجهزة أخرى بالأمر الجاهز:
# arabi --عامل عنوان_هذا_الجهاز:7700)
خ = شغّل(عامل، "127.0.0.1"، م.منفذ())
م.انتظر_العمال(1)                  # حجب حتمي حتى تكتمل العمالة

دالة مضروب(ن):
    لو ن <= ١:
        أعد ١
    أعد ن * مضروب(ن - ١)           # التعاود يعمل في العامل البعيد

ت = م.قدّم(مضروب، ٦)               # الدالة تعبر الشبكة بهويتها
اطبع(انتظر ت)                      # 720
م.إنهاء()                          # تصفية الجاري ثم وداع العمالة
  • طرق الموزع: قدّم(دالة، معاملات…، كلمات) تعيد مهمة موزعة، عمال() عدد المتصلين، منفذ() الفعلي بعد الربط، عنوان() المرتبط، حجم() عدد المقدَّم كله، انتظر_العمال(عدد؟، مهلة؟) حجب حتمي، إنهاء() يوقف القبول وينتظر التصفية ثم يودّع
  • طرق المهمة الموزعة: نتيجة() والخطأ() وجاهز() وانتظر() ومعرف() — الواجهة نفسها، فتعمل مع انتظر وانتظر_الجميع وسباق دون أي فرق
  • لا تضيع مهمة: انقطاع عامل (أو تعطله) يعيد أعماله الطائرة إلى رأس الطابور فتخدمها عمالة أخرى، والمهام المنتظرة تُصرف فور توفر أي عامل حتى أثناء إنهاء
  • ما الذي يعبر الشبكة؟ نفس ما يعبر حدود العملية: القيم البسيطة والدوال بإغلاقاتها والأصناف والكائنات والتعدادات وأخطاء المستخدم بهويتها — والحزمة تُرمّز لحظة التقديم فترفض القيم الحية قبل أن تشغل أي جهاز
  • النقل: TCP بإطارات موسومة بالطول (٤ بايتات + بيانات) وحد أقصى ٢٥٦ م.ب للإطار، ومهلة أمان ١٢٠ ثانية لانتظار النتيجة
  • المصادقة بالمفتاح (جديد في 1.19): مرر مفتاحًا سريًا معاملًا ثالثًا للموزع والعامل معًا — موزع(0، "0.0.0.0"، مفتاح) وعامل(المضيف، المنفذ، مفتاح) — فيصبح البروتوكول: الموزع يرسل تحديًا عشوائيًا (nonce من ٣٢ بايتًا) والعامل يوقعه HMAC-SHA256 بالمفتاح المشترك، والتحقق بمقارنة زمن ثابت — والعامل المخالف يُرفض برسالة عربية واضحة (مفتاح خاطئ / موزع بلا مفتاح / موزع مفتاحي بلا تحدٍّ) وتظل الشبكة الحرّة تعمل كما في 1.18 تمامًا. المصادقة تمنع العمالة الأجنبية — والبيانات العابرة لا تُشفَّر فتظل القاعدة: شبكة موثوقة أو نفق مشفر

الأمان والتشفير (جديد في 1.19)

اللغة تحتاج حماية بياناتها كأي نظام إنتاجي — وحدة تشفير تجلب كل ذلك من مكتبة بايثون القياسية وحدها (بلا أي تبعيات): بصمات تحفظ صحة البيانات، وتوقيع يثبت المصدر والسلامة، ومفاتيح عشوائية لا تُخمَّن، وكلمات مرور لا تُخزَّن أبدًا إلا بصمةً بملح عشوائي، واشتقاق مفاتيح من أسرار بشرية:

استورد تشفير

# البصمات — صحة البيانات (ست خوارزميات: sha256 الافتراضي، sha512،
# sha384، sha224، sha1، md5)
بصمة = تشفير.هش("ملف مهم")                   # sha256 ستر عشري
بصمة = تشفير.هش("ملف مهم"، "sha512")          # أو أي خوارزمية أخرى
اطبع(تشفير.هش512("نص"))                       # اختصار sha512

# توقيع الرسائل — المرسل والمستقبل يتشاركان المفتاح السري
مفتاح = تشفير.مفتاح_آمن()                      # 32 بايتًا عشوائيًا (64 حرفًا)
توقيع = تشفير.هوماك("أمر تحويل"، مفتاح)
# عند الاستلام: تحقق بزمن ثابت فلا يتسرب شيء من التوقيت
صالح = تشفير.مقارنة_آمنة(توقيع، تشفير.هوماك("أمر تحويل"، مفتاح))

# العشوائية الآمنة — للأسرار لا للألعاب (عكس عشوائية.عدد)
رمز_جلسة = تشفير.رمز_آمن(32)                   # base64url لروابط وإعادة ضبط
قرعة = تشفير.عدد_آمن(100)                      # 0 <= ن < 100 آمن تشفيريًا
قرعة = تشفير.عدد_آمن(50، 60)                   # 50 <= ن < 60

# كلمات المرور — الملح عشوائي لكل كلمة والبصمة PBKDF2-HMAC-SHA256
سجل = تشفير.شفر_كلمة("كلمة_السر"، 200000)      # جولات أعلى = أبطأ للمهاجم
# خزّن السجل كما هو: {"الخوارزمية"، "الجولات"، "الملح"، "البصمة"}
لو تشفير.تحقق_كلمة(إدخال_المستخدم، سجل):
    اطبع("مرحبا بك")

# اشتقاق المفاتيح — من سر بشري إلى مفتاح قناة بطول محدد
مفتاح_قناة = تشفير.مشتق("سر الفريق"، "قناة-الإنتاج"، 32)
الدالة الوظيفة
هش(نص، خوارزمية؟) بصمة ستر عشري بأي خوارزمية مدعومة (الافتراضي sha256)
هش512(نص) بصمة sha512 مباشرة
هوماك(نص، مفتاح، خوارزمية؟) توقيع HMAC ستر عشري
مقارنة_آمنة(أ، ب) مقارنة زمن ثابت — لا تكشف التوقيت شيئًا
مفتاح_آمن(بايتات؟) مفتاح عشوائي آمن (32 بايتًا = 64 حرفًا ستر عشري)
رمز_آمن(بايتات؟) رمز آمن بترميز base64url للروابط والتوكنات
عدد_آمن(حد؟، أقصى؟) عدد عشوائي آمن تشفيريًا في مدى
شفر_كلمة(كلمة، جولات؟) سجل تخزين آمن (PBKDF2 + ملح عشوائي، 100000 جولة افتراضيًا)
تحقق_كلمة(كلمة، سجل) تحقق من كلمة مقابل سجل — صح/خطأ
مشتق(كلمة، ملح، طول؟، جولات؟) اشتقاق مفتاح بطول محدد من سر بشري
شفّر(نص، مفتاح) تشفير نص بشفرة انسيابية HMAC-CTR موقّعة — يعيد سترًا عشريًا (1.21)
فكّ(مشفر، مفتاح) فك ناتج شفّر بعد التحقق من البصمة — مفتاح خاطئ أو تلاعب يُرفض (1.21)

وكل هذا يتكامل مع الشبكة الموزعة (1.18): مرر مفتاحًا سريًا معاملًا ثالثًا لـموزع وعامل معًا فيصبح لا عامل يُسجّل إلا بتوقيع تحدٍّ عشوائي بمفتاحه — موزع(0، "127.0.0.1"، تشفير.مفتاح_آمن()) من جهة وعامل(المضيف، المنفذ، المفتاح_نفسه) أو arabi --عامل م:منفذ --مفتاح سر من الجهة الأخرى. والموزع الحر يبقى كما هو تمامًا (توافق كامل مع 1.18) — أما المفتاحي فصار منذ 1.21 يشفّر كل شيء كما في القسم التالي.

السجل المجتمعي (جديد في 1.20)

سجل الحزم (1.12) يقرأ فهرسه من مكان واحد — والسجل المجتمعي يضع هذا المكان بين يديك: خادم كامل في ملف واحد يشغله أي جهاز فيه اللغة، فيستضيف فريقك حزمه الخاصة أو تعمل الشبكة المعزولة دون إنترنت. العميل الحالي يعمل عليه بلا أي تعديل:

# ١) شغّل السجل (على جهازك أو خادم الفريق) — مجلد المخزن ينشأ تلقائيًا:
arabi حزمة خادم سجلي --منفذ 8000
#    وللشبكة العامة أدرج مفتاحًا فلا نشر إلا موقّع:
#    arabi حزمة خادم سجلي --منفذ 8000 --عنوان 0.0.0.0 --مفتاح سر_النشر

# ٢) انشر حزمتك (مجلد ببيان أو ملف .عربي مفرد مع --نسخة):
arabi حزمة نشر حزم/ترحيب --الفهرس http://localhost:8000
arabi حزمة نشر حزم/ترحيب --الفهرس http://localhost:8000 --مفتاح سر_النشر

# ٣) ثبت من السجل في أي مشروع — كل أوامر 1.12 تعمل:
arabi حزمة تثبيت ترحيب --الفهرس http://localhost:8000/الفهرس.json
arabi حزمة بحث ترحيب --الفهرس http://localhost:8000/الفهرس.json
arabi حزمة تحديث ترحيب --الفهرس http://localhost:8000/الفهرس.json
  • بروتوكول الفهرس نفسه: GET /الفهرس.json يعيد فهرس 1.12 القياسي (اسم ← مصدر ونسخة ووصف) بروابط تنزيل من الخادم نفسه — و/index.json اسم آسكي بديل
  • مسارات عربية كاملة: /حزمة/<اسم> بيانات ونسخ، و/تحميل/<اسم>/<نسخة> الأرشيف (وبلا نسخة = الأحدث)، و/بحث/<كلمة>، و/معلومات حالة السجل
  • نشر محصّن: POST /نشر/<اسم>/<نسخة> يفحص الأرشيف قبل التخزين (بيان مطابق للعنوان، كود سليم نحويًا، حجم حتى 64 م.ب، بلا مسارات خطرة) — والنسخ غير قابلة للتعديل (409 لإعادة النشر) والفهرس يعرض الأحدث دومًا
  • نشر محمي بالمفتاح (تكامل 1.19): سجل مفتاحي يطلب ترويسة X-Arabi-Signature = HMAC-SHA256(المفتاح، محتوى الحزمة) — وأمر حزمة نشر --مفتاح يوقع لك، والتحقق بزمن ثابت
  • مخزن شفاف: مجلد عادي حزم/<اسم>/<نسخة>.zip مع بيان json لكل نسخة (الوصف والحجم والبصمة) — انسخه احتياطيًا أو انقله كما هو
  • تخزين ذري: الأرشيف ثم البيان يُكتبان بإحلال ذري تحت قفل — فلا فهرس يرى نصف حزمة أبدًا

التشفير الكامل للبيانات العابرة (جديد في 1.21)

المصادقة (1.19) تمنع العمالة الأجنبية من التسجيل — لكنها لا تخفي البيانات: من يتنصت على السلك يرى كود مهامك ونتائجها كما هي. الإصدار 1.21 يغلق هذا الباب الأخير: الموزع المفتاحي يشفّر كل شيء بعد المصافحة — أعمال العمالة ونتائجها وحتى رسائل الوداع:

# على الموزع — مفتاح واحد يفعل المصادقة والتشفير معًا:
موزع_محمي = موزع(7700، "0.0.0.0"، مفتاح_الشبكة)
اطبع(موزع_محمي.مشفّر())                    # صح — القناة مشفرة بالكامل

# على العامل — المفتاح نفسه، لا إعداد إضافي:
عامل(المضيف، 7700، مفتاح_الشبكة)            # أو: arabi --عامل م:منفذ --مفتاح سر
  • مفاتيح جلسة مشتقة لا مفتاح خام: بعد قبول التوقيع تُشتق زوج مفاتيح (تشفير، توثيق) من المفتاح المشترك وتحدي المصافحة بسياقين منفصلين — فكل اتصال له تيار مستقل، ولا مفتاح واحد يخدم غرضين
  • شفرة انسيابية بلا تبعيات: تيار المفاتيح HMAC-SHA256 في نمط العدّاد (كتلة ٣٢ بايتًا لكل عدّاد) مدموج بـ XOR — طول المشفر = طول الأصل، والمكوّنات كلها من المكتبة القياسية
  • Encrypt-then-MAC: كل إطار يُوقَّع بـ HMAC(مفتاح التوثيق، راوند || مشفر) ويتحقق بمقارنة زمن ثابت قبل فك أي بايت — مفتاح خاطئ أو تعديل ببت واحد يُرفض قبل أن يلمس النص
  • إعادة تشغيل بلا جدوى: راوند عشوائي لكل إطار ومفاتيح مستقلة لكل جلسة — إطار مسروق من جلسة لا تنجح بصمته في جلسة أخرى
  • ترويسة سحرية تميز الإطارات المشفرة: بها يعرف العامل أن القناة فُعلت ويرفض الرفض النصي المفتوح (رسائل المصافحة كالسابق) — والعامل القديم (<1.21) عند موزع مفتاحي يُسقط اتصاله فورًا: فشل مغلق لا صمت أمني
  • المسار الحر كما هو: موزع بلا مفتاح يعمل ببروتوكول 1.18 نفسه بتوافق كامل بالاتجاهين — التشفير يفعله المفتاح وحده

والشفرة نفسها متاحة لبرنامجك مباشرة في وحدة تشفير — خزّن نصوصًا مشفرة في ملفات أو قواعد بيانات أو أرسلها عبر أي قناة، والتحقق يسبق الفك دائمًا:

استورد تشفير

مشفر = تشفير.شفّر("سر الفريق: اجتماع الثلاثاء"، مفتاح)   # ستر عشري
اطبع(تشفير.فكّ(مشفر، مفتاح))                              # النص الأصلي

# مفتاح خاطئ؟ لا صمت أمني — خطأ عربي واضح قبل فك أي بايت
جرب:
    تشفير.فكّ(مشفر، "مفتاح_آخر")
باستثناء:
    اطبع("فشل التحقق — مفتاح خاطئ أو بيانات معدلة")

نموذج الذاكرة والتزامن (موثق في 1.23)

المهام غير المتزامنة والخيوط تعمل على خيوط نظام حقيقية تتشارك البيئة العالمية — وهذا يعني دلالات الخيوط القياسية المعروفة في بايثون ولغات المنظومة نفسها:

  • الإسناد الواحد ذري: عدد = ٥ من أي مهمة لا يفسد أبدًا — المخزن الداخلي عملية ذرية واحدة، وأثبتت الاختبارات صفر فساد في البيئة نفسها تحت أعلى ضغط.
  • قراءة-تعديل-كتابة ليست ذرية: عدد = عدد + ١ من مهمتين في آن واحد قد تخسر تحديثات — الخيطان يقرآن ثم يكتبان، وكتابة الأخير تمسح كتابة الأول (نفس سلوك بايثون وجافاسكربت المتعددة الخيوط بالضبط، ومع حمل التفسير تكون النافذة أعرض).
  • الحل القياسي: خيوط.قفل — احط التحديث بحجز وافراج فيصبح حتميًا دائمًا (واختبار 1.23 يثبت: مهمتان × ٥٠٠٠ بالقفل = ١٠٠٠٠ بالضبط في كل تشغيل):
عالمي عدد
عدد = ٠
استورد خيوط
ق = خيوط.قفل()

غير متزامنة دالة مهمة_أ():
    لكل س في مدى(٥٠٠٠):
        ق.احجز()
        عدد = عدد + ١
        ق.افرح()
  • لكل خيط كومة هذا مستقلة، والمولدات مرتبطة بخيطها، والوحدات تُحمل مرة واحدة — والباقي دلالات خيوط نظام كما هي.

البروتوكول الموزع الآمن (إصلاح 1.23)

كل ما يعبر الشبكة في وحدة موزعة — رسائل المصافحة والتحكم وحمولات الأعمال والنتائج — يسير الآن JSON منمطًا لا ينفذ شيئًا لحظة الفك. قبل 1.23 كانت أول رسالة تُفك بـpickle قبل التحقق من توقيع المصادقة، فأي طرف يصل لمنفذ الموزع كان يستطيع تنفيذ كود بايثون اعتباطي على المضيف (ثغرة RCE حرجة كشفها التدقيق العميق). الآن:

  • الفك بناء بيانات من قائمة بيضاء صرفة: عقد شجرة اللغة بقائمة أصنافها المغلقة، وقواميس وأزواج وسلاسل وأعداد — ولا مسار تنفيذ واحد في أي فاك.
  • عقدة مجهولة أو بنية غير مسموحة أو إطار تالف → خطأ عربي واضح ورفض الاتصال، وأثبته اختبار عدائي حي بخمس حمولات هجوم (مسجل مزيف، كائن __reduce__ خبيث، أمر مباشر...) — صفر تنفيذ والخدمة تبقى سليمة.
  • الطبقات الأعلى لم تُمس: مصادقة HMAC على التحدي، والقناة المشفرة Encrypt-then-MAC، وإطارات الطول الموسوم — كلها تعمل كما هي فوق الترميز الجديد.
  • العمالة والموزع يجب أن يكونا من إصدار متطابق (البروتوكول الداخلي تغير مع 1.23 — فشل مغلق واضح لا صمت مع الإصدارات المخلوطة).

واجهة السجل في المتصفح (جديد في 1.22)

السجل المجتمعي كان يعمل سطر أوامر فقط — والإصدار 1.22 يمنحه وجهًا يليق به: افتح عنوان الخادم في أي متصفح تجد لوحة استعراض كاملة، بلا أي أصول خارجية (CSS مدمج في الصفحة، لا جافاسكربت ولا خطوط من الشبكة) — فتعمل في الشبكات المعزولة تمامًا كما يعمل الخادم نفسه:

arabi حزمة خادم سجلي --منفذ 8000
# ثم افتح في المتصفح:  http://localhost:8000/
  • لوحة رئيسية على /: بطاقات حالة (عدد الحزم والنسخ ووضع النشر)، مربّع بحث فوقها، وجدول الحزم بوصفها وأحدث نسخها وروابط التحميل والتفاصيل — والبحث يمر بمعامل ?بحث=كلمة فيصفّي الجدول فورًا مع عدّاد النتائج
  • صفحة تفاصيل على /عرض/<اسم>: الوصف والنسخ كلها أحدثها أولًا بشارة، وكل نسخة بحجمها المقروء وبصمة sha256 (مختصرة بعرضها كاملًا في تلميح) ورابط تحميل مباشر، وأمر التثبيت جاهزًا للنسخ بعنوان السجل الحقيقي
  • أمان الصفحة: كل قيمة قادمة من الحزم (أسماء وأوصاف) تُهرَّب بـ html.escape قبل العرض — حزمة بوصف <script> تُعرض نصًا ولا تُنفَّذ أبدًا، والروابط كلها بترميز النسبة فتقبل الأسماء العربية
  • الترحيب النصي لم يذهب: انتقل إلى /ترحيب كما هو تمامًا — وعلم --بلا_واجهة في أمر حزمة خادم يعيد الجذر نفسه نصًا (لمن يشغّل السجل على خادم بلا حاجة للواجهة)
  • البروتوكول لم يمسّه الويب: /الفهرس.json و/حزمة و/تحميل و/بحث و/معلومات و/نشر كما هي كلها — العملاء القدامى لا يشعرون بوجود واجهة، و/معلومات أضاف حقل «الواجهة» لحالتها

الدوال الجاهزة

الدالة الوظيفة مثال
اطبع(...) طباعة القيم مفصولة بمسافة اطبع("أ"، ٥)
طول(س) طول نص/قائمة/قاموس طول([١، ٢]) → 2
مدى(أ، ب، خطوة) توليد تسلسل أعداد مدى(٥) أو مدى(١٠، ٠، -٢)
إدخال(رسالة) قراءة إدخال المستخدم عدد(إدخال("أدخل: "))
عدد(ق) تحويل إلى عدد صحيح عدد("٤٢") → 42
عشري(ق) تحويل إلى عدد عشري عشري("٣.٥") → 3.5
نص(ق) تحويل إلى نص نص(٣٠) → "30"
قائمة(ق) تحويل إلى قائمة قائمة(مدى(٣))
قاموس() قاموس فارغ قاموس()
جمع(قائمة) مجموع الأعداد جمع([١، ٢، ٣]) → 6
أكبر(...) / أصغر(...) أكبر/أصغر قيمة أكبر([٤، ٩]) → 9
مطلق(ع) القيمة المطلقة مطلق(-٥) → 5
تقريب(ع، ن) تقريب العدد تقريب(٣.٧) → 4
عشوائي(أ، ب) عدد عشوائي بين عددين عشوائي(١، ٦)
اختر(تسلسل) عنصر عشوائي اختر(["ورق"، "حجر"])
خريطة(د، ق) تطبيق دالة على كل عنصر خريطة(دالة(س) => س * ٢، [١، ٢])
مرشّح(د، ق) العناصر التي حققت الشرط مرشّح(دالة(س) => س > ٥، ق)
اختزل(د، ق، ب؟) طي القائمة إلى قيمة واحدة اختزل(دالة(أ، ب) => أ + ب، ق)
انتظر_الجميع([م١، م٢]) ينتظر كل المهام ويعيد النتائج بترتيبها انتظر_الجميع([جلب(أ)، جلب(ب)])
سباق([م١، م٢]) يعيد أول مهمة تنتهي (البقية تواصل) انتظر سباق([م١، م٢])
انتظر_زمن(ثوان) نوم المهمة الحالية وحدها انتظر_زمن(0.5)
تجمع(عدد) تجمع خيوط محدود: قدّم / إنهاء / حجم انتظر تجمع(٤).قدّم(دالة، ٥)
نوع(ق) اسم نوع القيمة نوع("ن") → "نص"
رتّب(قائمة) قائمة مرتبة جديدة رتّب([٣، ١]) → [1، 3]

رسائل الأخطاء

كل خطأ يخبرك بالسطر والمشكلة والحل المقترح:

خطأ تشغيلي في السطر ٥: المتغير 'الاسم' غير معرّف — تأكد من تعريفه أولًا
  ٥ |     اطبع("مرحبا " + الاسم)
    |     ^

الأمثلة

مجلد examples/ يحتوي على 43 مثالًا جاهزًا للتشغيل:

الملف ما يشرحه
01_مرحبا_بالعالم.عربي أول برنامج
02_المتغيرات.عربي المتغيرات والعمليات الحسابية
03_الشروط.عربي لو / وإلا إذا / وإلا
04_الحلقات.عربي لكل / طالما / كسر / استمر
05_الدوال.عربي التعريف والتعاود والإغلاق
06_القوائم.عربي الفهرسة والتقطيع والطرق
07_القواميس.عربي المفاتيح والقيم والتفكيك
08_فيبوناتشي.عربي الإسناد المتعدد والخوارزميات
09_معالجة_الأخطاء.عربي جرب / باستثناء / ارفع
10_لعبة_التخمين.عربي برنامج تفاعلي كامل
11_الوحدات.عربي استيراد رياضيات ووقت
12_الأصناف.عربي صنف / هذا / الوراثة / الأصل
13_الاستيراد.عربي وحدات من ملفاتك: استورد / من…استورد / المسارات
14_الدوال_السهمية.عربي السهميات والقيم الافتراضية والمعاملات بالاسم
15_بدل_الحالة.عربي بدّل / حالة / افتراض وكسر داخل الحلقات
16_الملفات_وجيسون.عربي وحدة ملفات وجيسون وخريطة/مرشّح/اختزل
17_السلاسل_المنسقة.عربي ق"..." والنصوص متعددة الأسطر والطرق النصية
18_الميزات_المتقدمة.عربي تعداد / خاصية / تحميل العوامل / عالمي / تحقق / احذف / الأخطاء المخصصة
19_وحدات_الجديدة.عربي عشوائية / تنظيم / تحويل (التفقيط) / نظام / توسيع رياضيات ووقت
20_الشبكة.عربي طلبات HTTP من لغة عربي مع جرب/باستثناء/اخيرا
21_الاختبارات.عربي إطار الاختبارات: يساوي / يصح / يرفع / ملخص
22_الخادم.عربي خادم ويب حقيقي: صفحة رئيسية + واجهات API + إيقاف
23_المولدات.عربي أنتج: التكرار والكسر وقائمة() والتالي() والمولدات كطرق
24_المزخرفات_والوراثة_المتعددة.عربي @زمني و@محفوظ والوراثة المتعددة وترتيب MRO
45_مواصفة_اللغة.عربي ٪ و٪= وأرقام ٫٬ والتقاط بالصنف بكـ والمزخرف مع غير المتزامنة
25_قاعدة_البيانات_والترميز.عربي SQLite كاملة + Base64 والبصمات + تصدير CSV
26_الواجهات.عربي واجهة / طرق مجردة وتنفيذ افتراضي ووراثة الواجهات
27_المعاملات_المتغيرة.عربي ...الاسم و...التفكيك في الاستدعاء والقوائم والمولدات
28_الخيوط.عربي شغّل / انتظر_الكل / قفل وذاكرة مشتركة / طابور المنتج والمستهلك
29_مطابقة_الأنماط.عربي طابق/حالة: الحرفيات والبدائل والحرّاس وتفكيك القوائم والقواميس
30_السلاسل_الخام_والتواريخ.عربي السلاسل الخام مع تنظيم + وحدة تواريخ كاملة
31_بروتوكول_التكرار_والإحصاء.عربي تالٍ/أول للتكرار المخصص + في والنشر + وحدة إحصاء
32_فهم_القوائم.عربي فهم القوائم والقواميس: تحويل وترشيح وتفكيك وعبارات متتالية ونقل مصفوفة
33_معالجة_البيانات.عربي سيناريو مبيعات كامل: ترشيح وتجميع وإحصاء بتعبيرات سطر واحد
34_سجل_الحزم.عربي استخدام حزمة مثبتة في حزم/ مع بيان حزمة.json ومدخل مخصص
35_بناء_حزمة.عربي بناء حزمة للنشر: بيان حزمة.json وملفات الكود وهيكل المجلد
36_الدولاب_الافتراضي.عربي تنفيذ بالبايت-كود: حلقات وتعاود وأصناف مع تكافؤ --لا-دولاب
37_غير_المتزامن.عربي مهام متوازية: غير متزامنة دالة وانتظر وانتظر_الجميع وسباق وطرق المهمة والأخطاء
38_تجمع_الخيوط.عربي تجمع خيوط محدود: قدّم/إنهاء/حجم وحد التزامن وطرق الأصناف وكلمات المفاتيح والأخطاء
39_توازي_العمليات.عربي عمليات منفصلة تتجاوز GIL: شغّل وتجمع وانتظر_الجميع والأخطاء المخصصة والكائنات عبر العمليات
40_الحوسبة_الموزعة.عربي موزع وعمالة عبر TCP: قدّم وانتظر وانتظر_الجميع وأخطاء بهويتها وكائنات تعبر الشبكة والإنهاء النظيف
41_الأمان_والتشفير.عربي وحدة تشفير كاملة: بصمات وهوماك ومفاتيح آمنة وكلمات مرور PBKDF2 واشتقاق ثم شبكة موزعة محمية بمفتاح مشترك
42_السجل_المجتمعي.عربي سجل حزم تستضيفه بنفسك: خادم ونشر وتثبيت — وحزمة ترحيب كنموذج مثبت من السجل
43_التشفير_الكامل.عربي شفّر/فكّ للنصوص: راوند عشوائي ورفض مفتاح خاطئ وكشف تلاعب وسجل أسرار مشفر — ثم شبكة موزعة بقناة مشفرة كاملة
44_واجهة_السجل.عربي لوحة السجل في المتصفح: خادم لغة يخدم لوحة مصغّرة بنفس فكرة 1.22 ثم يتصفحها بشبكة.اطلب — بحث وتفاصيل و404 عربية

الاختبارات

المشروع مغطى بـ1214 اختبارًا يغطي المحلل اللفظي والنحوي والمفسر والسلاسل المنسقة والبرمجة الكائنية والوحدات والدوال السهمية وبدّل/حالة والدوال ذات الترتيب الأعلى وكل ميزات 1.5 و1.6 (التعداد والخصائص وتحميل العوامل والأخطاء المخصصة وإطار الاختبارات والخوادم والأدوات) وكل ميزات 1.7 (المولدات والمزخرفات والوراثة المتعددة وقاعدة وترميز وجداول) وكل ميزات 1.8 (الواجهات والمعاملات المتغيرة والتفكيك ووحدة خيوط) وكل ميزات 1.9 (مطابقة الأنماط والسلاسل الخام ووحدة تواريخ) وكل ميزات 1.10 (بروتوكول التكرار المخصص ووحدة إحصاء وخادم اللغة LSP) وكل ميزات 1.11 (فهم القوائم والقواميس والكود الوسيط بذاكرته وإبطاله) وكل ميزات 1.12 (سجل الحزم: النسخ والقيود والفهرس والتثبيت والإزالة والتحديث والقفل واستيراد الحزم) وكل ميزات 1.13 (الدولاب الافتراضي: تكافؤ تفاضلي شامل مع الممسح الشجري على كل الأمثلة وترجمة الدوال وتخزينها والأعلام) وكل ميزات 1.14 (التنفيذي المستقل: كشف الوضع المجمد وسطر الإصدار واسم البرنامج المتكيف وملف المواصفة وسكربت البناء) وكل ميزات 1.15 (غير المتزامن: التحليل السياقي والدلالات والمجمّعات والأخطاء وتكافؤ الدولاب وتنزيل الشبكة بخادم محلي) وكل ميزات 1.16 (تجمع الخيوط: الدلالات وحد التزامن والإنهاء وتكافؤ الدولاب + التوزيع: بيان pyproject وتوافق الإصدارات وتثبيت pip الفعلي وسير الإصدارات) وكل ميزات 1.17 (توازي العمليات: ترميز القيم وفكها بذاكرته الأصناف والتعدادات والإغلاق الذاتي وأخطاء المستخدم عبر العمليات وعمليات شغّل الحقيقية وتجمع العمليات وسباق على مهام العمليات ورفض القيم الحية وتكافؤ الدولاب) وكل ميزات 1.18 (الحوسبة الموزعة: إطارات البروتوكول وحراسه، إنشاء الموزع وتحققاته، تقديم المهام ورفض غير القابل والمولد والقيم الحية، تكافؤ الدولاب، العمالة الحقيقية عبر TCP والنتائج والمعاملات بالاسم والعالميات والأصناف والكائنات وأخطاء المستخدم بهويتها والمتزامن الملفوف والسباق وإعادة طوابير انقطاع العامل والتصفية عند الإنهاء والعامل من سطر الأوامر) وكل ميزات 1.19 (وحدة التشفير: البصمات بالخوارزميات الست وهوماك والمقارنة الآمنة والمفاتيح والرموز وعدد_آمن بمداه، وسجلات كلمات المرور وتحققها بسجلات فاسدة، والاشتقاق الحتمي، وتوقيع التحدي والتحقق منه، والمصادقة الشبكية بأربعة سيناريوهات ناجحة ورفض رباعي واضح: مفتاح خاطئ، عامل مفتاحي عند موزع حر، عامل حر عند موزع مفتاحي، مفتاح فارغ أو غير نصي، والعامل المفتاحي من سطر الأوامر) وكل ميزات 1.20 (السجل المجتمعي: خادم الفهرس الحقيقي عبر HTTP — الترحيب والفهرس الفارغ، النشر من مجلد وملف مفرد، أحدث نسخة في الفهرس، التثبيت والاستيراد والتحديث من السجل، عدم قابلية النسخ للتعديل، حماية النشر بالمفتاح بلا توقيع ومفتاح خاطئ وصحيح، رفض عدم تطابق الاسم والنسخة والكود غير السليم، بيانات الحزمة والبحث خادمًا وعميلًا، أخطاء 404 بأسماء عربية، قبول رابط الفهرس كاملًا، الإيقاف الثنائي الآمن، ونشر وخادم من سطر الأوامر بعمليات حقيقية) وكل ميزات 1.21 (التشفير الكامل: الشفرة الانسيابية بتيار HMAC-CTR ودورتها على كل أحجام البايتات والتحقق قبل الفك، وشفّر/فكّ على مستوى اللغة بمدخلاتها المرفوضة كلها، ومفاتيح القناة بسياقيها المنفصلين وانعكاسية التيار، والقناة المشفرة على سلك حقيقي: ترويسة الإطارات وغياب الوسيط عن السلك وفك المحتوى بالمفتاح وإكمال المهمة، والمسار الحر الخام كما هو، والفشل المغلق لعامل قديم، وإسقاط الاتصال عند التلاعب، ورفض إعادة التشغيل العابرة للجلسات) وكل ميزات 1.22 (واجهة السجل: اللوحة الرئيسية ببطاقاتها وجدولها والحالة الفارغة، والبحث بمعامل «بحث» بالاسم والوصف وعدّاد النتائج، وصفحة التفاصيل بنسخها مرتبة أحدثها أولًا وأحجامها وبصماتها الكاملة والمختصرة وأمر التثبيت، و404 HTML للتفاصيل الغائبة، والترحيب النصي على /ترحيب بمساراته المحدثة، وتهريب محتوى الحزم الخبيث في اللوحة والتفاصيل والعنوان، والجذر النصي مع --بلا_واجهة ورفض /عرض برسالة عربية، وسطر الأوامر بالعلم الجديد والافتراضي المفعل، وسلامة بروتوكول 1.12 كله تحت الواجهة، وروابط تحميل حقيقية مطلقة مهربة الترميز) ورسائل الأخطاء وجميع الأمثلة:

python3 -m unittest discover -s tests -v

وفحص سريع للصياغة بلا تنفيذ:

python3 arabi.py --تحقق examples/01_مرحبا_بالعالم.عربي

بنية المشروع

arabi-lang/
├── arabi.py                # نقطة الدخول: CLI + REPL + حزمة + --بايت + --لغة
├── arabi_lang/             # حزمة اللغة
│   ├── tokens.py           # تعريف الرموز
│   ├── lexer.py            # المحلل اللفظي
│   ├── parser.py           # المحلل النحوي (AST)
│   ├── nodes.py            # عقد شجرة الصياغة
│   ├── runtime.py          # القيم والدوال الجاهزة والوحدات القياسية
│   ├── tools.py            # أدوات النظام البيئي: منسق وفاحص وتوثيق وحزم
│   ├── lsp.py              # خادم اللغة: تشخيص وإكمال وتلميح ورموز وتعريف
│   ├── bytecode.py         # الكود الوسيط: تسلسل الشجرة والذاكرة المؤقتة
│   ├── packages.py         # سجل الحزم: الفهرس والنسخ والقيود والتثبيت والقفل والنشر
│   ├── registry.py         # السجل المجتمعي: خادم الفهرس والتنزيل والنشر المحمي وواجهة المتصفح (1.20، 1.22)
│   ├── processes.py        # توازي العمليات: ترميز القيم والعمال والتجمع (1.17)
│   ├── distributed.py      # الحوسبة الموزعة: البروتوكول والموزع والعامل والمصادقة والقناة المشفرة (1.18-1.21)
│   ├── crypto.py           # الأمان والتشفير: بصمات وهوماك وكلمات مرور وتوقيع التحدي والشفرة الانسيابية (1.19، 1.21)
│   ├── vm.py               # الدولاب الافتراضي: مترجم البايت-كود وحلقة التنفيذ
│   ├── interpreter.py      # المفسر
│   └── errors.py           # نظام الأخطاء العربي
├── examples/               # 45 مثالًا عمليًا + مجلدا وحدات/ وحزم/
├── docs/                   # مواصفة اللغة الرسمية (EBNF + الدلالات)
├── editor/vscode/          # امتداد VS Code (تلوين + مقتطفات + عميل LSP)
├── tests/                  # 1081 اختبارًا
├── scripts/                # سكربتات البناء: بناء_التنفيذي.sh
├── pyproject.toml          # حزمة بايثون القياسية: pip install + الأمر arabi
├── عربي.spec               # مواصفة بناء الملف التنفيذي المستقل (PyInstaller)
└── .github/                # CI (workflows/tests.yml) + سير الإصدارات الجاهز للتفعيل (workflow-templates/release.yml)

خارطة الطريق

  • الأصناف والبرمجة الكائنية — متوفر منذ الإصدار 1.1 (صنف / هذا / من / الأصل)
  • وحدات من ملفات .عربي أخرى — متوفر منذ الإصدار 1.2 (استورد / من…استورد / مسارات)
  • معاملات باسم وقيم افتراضية — متوفر منذ الإصدار 1.2
  • دوال على سطر واحد (سهمية) — متوفر منذ الإصدار 1.2 (دالة(س) => تعبير)
  • امتداد VS Code بالتلوين والمقتطفات — متوفر منذ الإصدار 1.2 في editor/vscode/
  • جملة بدّل/حالة/افتراض — متوفرة منذ الإصدار 1.3
  • دوال ترتيب أعلى (خريطة/مرشّح/اختزل) — متوفرة منذ الإصدار 1.3
  • وحدات ملفات وجيسون — متوفرة منذ الإصدار 1.3
  • سلاسل منسقة ونصوص متعددة الأسطر — متوفرة منذ الإصدار 1.4 (ق"نص {تعبير}" / ثلاث علامات اقتباس)
  • تعداد وخصائص محسوبة وتحميل عوامل — متوفرة منذ الإصدار 1.5 (تعداد / خاصية / اجمع يساوي نص…)
  • أخطاء مخصصة وربط باستثناء — متوفرة منذ الإصدار 1.5 (صنف خطأ من استثناء / باستثناء هـ:)
  • تعبير ثلاثي وعالمي وتحقق واحذف — متوفرة منذ الإصدار 1.5
  • وحدات عشوائية ونظام وتنظيم وشبكة وتحويل — متوفرة منذ الإصدار 1.5
  • أداة فحص الصياغة — متوفرة منذ الإصدار 1.5 (--تحقق)
  • إطار اختبارات داخل اللغة — متوفر منذ الإصدار 1.6 (وحدة اختبارات)
  • خوادم ويب — متوفرة منذ الإصدار 1.6 (وحدة خادم)
  • منسق كود وفاحص مشكلات ومولد توثيق — متوفرة منذ الإصدار 1.6 (--نسق / --افحص / --وثق)
  • مدير حزم بمجلد مكتبات — متوفر منذ الإصدار 1.6 (--ثبت / --حزم)
  • المولدات — متوفرة منذ الإصدار 1.7 (أنتج / التالي() / تكرار لكل)
  • المزخرفات — متوفرة منذ الإصدار 1.7 (@اسم / تكديس / على الطرق)
  • الوراثة المتعددة بترتيب C3 — متوفرة منذ الإصدار 1.7 (صنف ابن من أ١، أ٢)
  • قواعد بيانات SQLite — متوفرة منذ الإصدار 1.7 (وحدة قاعدة)
  • ترميز Base64 وبصمات — متوفرة منذ الإصدار 1.7 (وحدة ترميز)
  • جداول CSV — متوفرة منذ الإصدار 1.7 (وحدة جداول)
  • واجهات وأصناف مجردة للوراثة الصارمة — متوفرة منذ الإصدار 1.8 (واجهة شكل: + تحقق عند الإنشاء)
  • معاملات متغيرة وتفكيك — متوفرة منذ الإصدار 1.8 (...الاسم / ...قائمة)
  • خيوط تنفيذ متوازية بذاكرة مشتركة — متوفرة منذ الإصدار 1.8 (وحدة خيوط: شغّل/قفل/طابور)
  • مطابقة الأنماط — متوفرة منذ الإصدار 1.9 (طابق / حالة نمط إن شرط: / غير ذلك:)
  • السلاسل الخام — متوفرة منذ الإصدار 1.9 (خ"\\d+" بلا معالجة هروب)
  • وحدة تواريخ — متوفرة منذ الإصدار 1.9 (أنشئ / حلل / فرق / أضف / أيام أسبوع عربية)
  • بروتوكول التكرار المخصص — متوفر منذ الإصدار 1.10 (تالٍ() / أول() اختيارية / لكل وفي و... على الكائنات)
  • وحدة إحصاء — متوفرة منذ الإصدار 1.10 (معدل / وسيط / منوال / تباين / انحراف / مدى)
  • خادم لغة (LSP) للإكمال الذكي داخل المحررات — متوفر منذ الإصدار 1.10 (--لغة: تشخيص/إكمال/تلميح/رموز/تعريف)
  • فهم القوائم والقواميس — متوفر منذ الإصدار 1.11 ([ت لكل س في م إن شرط] مع التفكيك وعبارات لكل متتالية)
  • كود وسيط (Bytecode) بذاكرة تلقائية — متوفر منذ الإصدار 1.11 (__بايت__/*.بيت مع إبطال ذكي و--بايت/--لا-بايت)
  • سجل حزم مركزي لمشاركة مكتبات .عربي — متوفر منذ الإصدار 1.12 (حزمة تثبيت/إزالة/قائمة/بحث/تحديث + فهرس + تبعيات + قفل.json)
  • مفسّر بايت-كود تنفيذي (دولاب افتراضي) لتسريع التنفيذ نفسه — متوفر منذ الإصدار 1.13 (ترجمة أجسام الدوال تلقائيًا + احتياط شفاف + --لا-دولاب)
  • توزيع المفسّر كملف تنفيذي مستقل بلا حاجة لبايثون — متوفر منذ الإصدار 1.14 (scripts/بناء_التنفيذي.sh + جاهز للتحميل من الإصدارات)
  • برمجة غير متزامنة (غير متزامنة دالة / انتظر / مهام) — متوفرة منذ الإصدار 1.15 (مهمة بطرقها + انتظر_الجميع + سباق + انتظر_زمن + شبكة.تنزيل)
  • تجمع خيوط محدود الحجم لتشغيل كثيف منظّم — متوفر منذ الإصدار 1.16 (تجمع(عدد) + قدّم / إنهاء / حجم + حد التزامن تلقائيًا)
  • التوزيع عبر pip كحزمة بايثون قياسية — متوفر منذ الإصدار 1.16 (pyproject.toml + الأمر arabi + python -m arabi)
  • ثنائيات جاهزة لويندوز وماك عبر سير بناء آلي — متوفر منذ الإصدار 1.16 (.github/workflow-templates/release.yml جاهز للتفعيل: نقل أو لصق في واجهة GitHub — يبني مع كل وسم v* لثلاثة أنظمة)
  • توازي العمليات بذاكرة معزولة تتجاوز GIL — متوفر منذ الإصدار 1.17 (وحدة عمليات: شغّل / تجمع / معالجات / معرفي بنقل قيم كامل)
  • الحوسبة الموزعة عبر الشبكة الحقيقية — متوفر منذ الإصدار 1.18 (وحدة موزعة: موزع / عامل / --عامل + قدّم وانتظر_الجميع وسباق على مهام الأجهزة الأخرى)
  • الأمان والتشفير ومصادقة الشبكة — متوفر منذ الإصدار 1.19 (وحدة تشفير: بصمات وهوماك ومقارنة زمن ثابت ومفاتيح آمنة وشفر_كلمة/تحقق_كلمة ومشتق + مصادقة الموزعة بتحدي HMAC بمفتاح مشترك)
  • سجل حزم مجتمعي تستضيفه بنفسك — متوفر منذ الإصدار 1.20 (حزمة خادم خادم فهرس كامل ببروتوكول 1.12 + حزمة نشر بنسخ غير قابلة للتعديل وفحص نحوي وتوقيع HMAC اختياري)
  • تشفير كامل للبيانات العابرة للشبكة الموزعة — متوفر منذ الإصدار 1.21 (قناة مشفرة موثقة بعد المصادقة بمفاتيح جلسة مشتقة من المفتاح وتحدي الاتصال + تشفير.شفّر/فكّ للغة + موزع.مشفّر())
  • واجهة ويب للسجل المجتمعي — متوفر منذ الإصدار 1.22 (لوحة عربية RTL على الجذر مع بحث وصفحات تفاصيل /عرض/<اسم> بلا أصول خارجية وكل القيم مهربة، والترحيب النصي على /ترحيب، و--بلا_واجهة للجذر النصي)

الخارطة مكتملة ١٠٠٪ مع أفكار ما بعد الخارطة 🎉 — بدأت بـ٥٥ اختبارًا في 1.0 وبلغت ٩٣٩ في 1.17 ثم ٩٧٧ في 1.18 ثم ٩٩٩ في 1.19 ثم ١٠١٦ في 1.20 ثم ١٠٣٣ في 1.21 ثم ١٠٤٥ في 1.22 ثم ١٠٨١ في 1.23. أفكار ما بعد الخارطة كلها منجزة الآن (السجل المجتمعي 1.20، وتشفير البيانات العابرة 1.21، وواجهة ويب للسجل 1.22) — والمتبقي الوحيد غير المبرمج: نشر الحزم إلى PyPI فعليًا (يحتاج أسرار نشر حقيقية من مستخدم الحساب).

المساهمة

المساهمات مرحب بها! اقرأ دليل المساهمة ثم:

  1. اعمل Fork للمشروع
  2. أنشئ فرعًا لميزتك: git checkout -b ميزة-جديدة
  3. تأكد من نجاح الاختبارات: python3 -m unittest discover -s tests
  4. أرسل Pull Request

الترخيص

المشروع مرخص تحت رخصة MIT — استخدمه وتعلم منه وطوّره بحرية.

Metadata

Release files for arabi-lang 1.28.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for arabi-lang 1.28.0
File Size Uploaded
arabi_lang-1.28.0.tar.gz 417.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for arabi-lang 1.28.0
File Interpreter ABI Platform
arabi_lang-1.28.0-py3-none-any.whl Python 3 none any Details

Total release size: 648.7 kB

Release files / arabi_lang-1.28.0.tar.gz

Download URL arabi_lang-1.28.0.tar.gz
Size 417.0 kB
Tags Source
SHA-256 checksum
How to use checksums
26f85ec085ff05e23fa8290366d63d6c72fa0e7116c6b3ee9e7e5641be719339
BLAKE2b-256 checksum
How to use checksums
a41226441eb389f4e45374bfc65be48b5d151e599e996ec1ee64e4a65b4031be
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.14

Release files / arabi_lang-1.28.0-py3-none-any.whl

Download URL arabi_lang-1.28.0-py3-none-any.whl
Size 231.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
24eb4a722f2fdf015262836343a095658887027fb317426254284058c6f6cc00
BLAKE2b-256 checksum
How to use checksums
96997bf6125a8757efcf3dd3792e29a965d7a3fd2dd4de5d6197185b0ad9bee6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.14

Release history Release notifications | RSS feed

1.29.0

2 release files

This release

1.28.0 This release

2 release files

1.27.0

2 release files

1.26.0

2 release files

1.25.0

2 release files

1.24.0

2 release files

1.23.0

2 release files

1.22.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page