Menu
flag Ar iconالعربيةdown icon

حلقات while في Zero: التكرار في اللغة الموجَّهة للوكلاء

كيف تعمل حلقات while في Zero اليوم: الشرط، جسم الحلقة، غياب for وdo-while في اللغة المبكّرة، وما علاقة الحلقات بالتأثيرات الصريحة.

تحتوي هذه الصفحة على محررات قابلة للتشغيل — حرّر، شغّل، وشاهد النتيجة فوراً.

الأساسيات

تُشغّل while جسمها طالما بقي شرط من النوع bool على القيمة true:

while condition {
    // الجسم
}

يُقيّم المترجم الشرط قبل كل تكرار:

  • true — يُشغّل الجسم ثم يفحص مجدّدًا.
  • false — يخرج من الحلقة.

توضيح بسيط من أمثلة Zero، بشرط false منذ البداية:

شغّل هذا وسيُطلَق write الثاني فقط. جسم while لا يُنفَّذ أبدًا لأن الشرط كان false في أوّل مرة تمّ فحصه فيها.

الشرط من النوع bool

كما في if/else، يجب أن يكون شرط الحلقة من النوع bool. لا تُحوّل Zero الأعداد الصحيحة أو النصوص أو القيم الأخرى تلقائيًا إلى قيمة منطقية.

while count {              // خطأ ترجمة
    // ...
}

while count > 0 {          // صحيح
    // ...
}

الشرط قد يكون أي شيء يُقيَّم إلى bool: ربط، أو مقارنة، أو تركيب &&/||، أو استدعاء دالة. نفس قواعد if تنطبق.

حلقات بعدّاد

النمط الكلاسيكي "افعل شيئًا N مرة" يستخدم عدّادًا وwhile:

let mut i = 0
while i < 10 {
    // العمل
    i = i + 1
}

ثلاث قطع: قيمة ابتدائية، شرط يُقارن مع الحدّ، وتحديث في الجسم. هذا النمط موجود في كل لغة إجرائية — Zero فقط لا تُغلّفه بكلمة for.

ملاحظة بشأن صياغة mut أعلاه: طريقة كتابة الروابط القابلة للتعديل في Zero قد تختلف في إصدارات ما قبل 1.0 من سلسلة أدواتك. شغّل zero check --json على اختبار صغير للتأكّد من الصياغة الدقيقة التي يقبلها مترجمك. النمط المفاهيمي (عدّاد + شرط + تحديث) هو الجزء المستقرّ.

الحلقات اللانهائية

حلقة while شرطها دائمًا true تعمل إلى الأبد:

while true {
    // انتظر العمل، عالجه، كرّر
}

هذا هو الشكل الصحيح لحلقة أحداث، أو REPL، أو خادم طويل العمل. للخروج، إمّا أن تُنهي العملية، أو ترفع خطأً من الجسم، أو تُعيد هيكلة الشرط ليكسر.

متى تلجأ إلى الحلقة

الحلقات أداة استخدمها باعتدال. أشياء تبدو كحلقات في لغات أخرى تأخذ في الغالب شكلًا أنظف في Zero:

  • التكرار على مجموعة ثابتة: فضّل دالة تكشفها المكتبة القياسية أو بنيتك (shape) — مساعد بنمط forEach، أو طاوية (folder)، أو مَشي تكراري (recursive walk).
  • القراءة حتى نهاية الإدخال: اعمل حلقة على قراءة قابلة للفشل، لكن استخدم check وraises لمعالجة الحدّ بشكل نظيف بدلًا من تداخل أعلام الحالة.
  • استطلاع شرط: تأمّل ما إذا كان التصميم يجب أن يُسلّمك إشارة بدل ذلك. حلقات الاستطلاع علامة سيّئة في أي لغة أنظمة.

نفس الحدس ينطبق على الوكلاء: شكل ضيّق وتصريحي أسهل للاستدلال عليه من حلقة عدّاد مكتوبة يدويًا، للبشر ولمولّدات الشيفرة.

الحلقات والتأثيرات

جسم while، مثل أي كتلة أخرى، يستطيع تنفيذ إدخال/إخراج — لكن فقط إذا كان لديه وصول إلى قدرة World (أو شريحة منها). دالة لا يذكر توقيعها World تستطيع الحلقة كما تشاء لكن لا تستطيع كتابة أي شيء إلى الخارج. هذه الخاصية تبقى صحيحة داخل جسم الحلقة أيضًا؛ الحلقة لا تمنح أي قدرات جديدة.

يبدو هذا بديهيًا، لكنّه السبب الذي يسمح لك بوضع while داخل دالة حساب "نقية" ولا تزال تعرف — من التوقيع وحده — أنها لا تستطيع طباعة شيء ولا الكتابة إلى القرص.

ملاحظات أسلوبية

عادات صغيرة تعود بالنفع:

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

التالي: البِنى (Shapes)

رأيت الآن تدفّق التحكّم الأساسي في Zero. الفصل التالي يدور حول نمذجة البيانات — بدءًا من البِنى shapes، الأنواع المنتجة الشبيهة بـ struct في Zero.

الأسئلة الشائعة

كيف تعمل حلقات while في Zero؟

استخدم while condition { ... }. يُقيَّم الشرط قبل كل تكرار؛ إذا كان true، يعمل الجسم وتتحقّق الحلقة مجدّدًا. إذا كان false، تخرج الحلقة ويستمرّ التنفيذ بعد القوس المغلق. الشرط يجب أن يكون من النوع bool.

هل لدى Zero حلقة for؟

تأتي Zero المبكّرة بـ while كبنية الحلقة الوحيدة. تُبقي اللغة سطحها صغيرًا عمدًا بينما تستقرّ — كلمات مفتاحية أقلّ تعني طرقًا أقلّ ليختار الوكيل شكلًا خاطئًا. قد تصل for على نطاق أو مجموعة لاحقًا؛ حتى ذلك الحين، تبني النمط نفسه بـ while وعدّاد.

كيف تكتب حلقة بعدّاد في Zero؟

هيِّئ عدّادًا، نفّذ while عليه، وحدّثه داخل الجسم: let mut i = 0; while i < 10 { ...; i = i + 1 }. صياغة قابلية التعديل لا تزال تتطوّر في Zero قبل الإصدار 1.0، لذا راجع التوثيق الحالي للصياغة الدقيقة — لكن نمط while + عدّاد + تحديث هو الأسلوب القياسي لحلقة العدّ.

هل توجد break أو continue في Zero؟

معظم اللغات في عائلة Zero تُقدّم بنية خروج مبكّر للحلقات؛ صياغتها الدقيقة في Zero قبل الإصدار 1.0 من الأمور التي قد تتغيّر قبل 1.0. الأسلوب المُتحفّظ هو هيكلة الحلقة بحيث يقوم الشرط نفسه بالعمل — اقلب الشرط وحدّثه ليخرج بشكل طبيعي — بدلًا من الاعتماد على كلمة مفتاحية محدّدة لتدفّق التحكّم.

هل يمكن لحلقة while في Zero أن تعمل إلى الأبد؟

نعم — while true { ... } حلقة لا نهائية. مفيدة للخوادم، وحلقات الأحداث، وREPLs، وأي شيء لا يوجد له شرط إنهاء طبيعي. بخلاف التحويل الضمني لقيم الصدق، true هنا قيمة حرفية من النوع bool فالشرط لا يزال صحيح الأنواع.

Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن