الحلقات (for)
📄 الأصل: for-loop.nfth
📦 تحميل الملف: ⬇ تحميل
🔗 عرض الملف:
--- SPDX-License-Identifier: Apache-2.0
--- Copyright © The Naftah Project Authors
---*
هذا الملف يشرح كيفية استخدام الحلقات (loops) في لغة نفطه، ويغطي:
- الحلقات العددية المتزايدة والمتناقصة
- الحلقات مع خطوات مخصصة (step)
- التحكم في تدفق الحلقة باستخدام "اكسر" و"تابع"
- الحلقات المتداخلة
- الحلقات المسماة لكسر/تخطي حلقة معينة بدقة
- التكرار على القوائم والمصفوفات باستخدام `من` و `داخل`
- التكرار على الكائنات باستخدام `من_بين`
- التكرار على الكائنات المعقدة باستخدام `أ؛ب:ت`
*---
--- حلقة تكرارية من 1 إلى 5
كرر_حلقة أ تعيين 1 إلى 5 إفعل {
إطبع(أ) --- طباعة قيمة المتغير أ في كل دورة
}
أنهي
--- حلقة تنازلية من 10 إلى 1
كرر_حلقة أ تعيين 10 تنازليا 1 إفعل {
إطبع(أ) --- العد تنازلي من 10 إلى 1
}
أنهي
--- حلقة بكسر مبكر عند أ == 2
كرر_حلقة أ تعيين 1 إلى 3 إفعل {
إذا أ == 2 إذن {
اكسر --- إنهاء الحلقة عند وصول أ إلى 2
}
أنهي
}
غير_ذلك {
إطبع("لم يتم كسر الحلقة") --- هذا الجزء يُنفذ فقط إذا لم تُكسر الحلقة
}
أنهي
--- حلقة بدون كسر، تطبع "لم يتم كسر الحلقة"
كرر_حلقة أ تعيين 1 إلى 3 إفعل {
إذا أ == 5 إذن {
اكسر --- لن يتحقق الشرط، فالحلقة لن تُكسر
}
أنهي
}
غير_ذلك {
إطبع("لم يتم كسر الحلقة") --- ستُطبع لأن الحلقة لم تُكسر
}
أنهي
--- استخدام "تابع" لتخطي قيمة محددة (٣)
كرر_حلقة أ تعيين 1 إلى 5 إفعل {
إذا أ == 3 إذن {
تابع --- عند الوصول إلى 3، تُتخطى الطباعة وتبدأ دورة جديدة
}
أنهي
إطبع(أ)
}
أنهي
--- حلقة متداخلة (أ × ب)
كرر_حلقة أ تعيين 1 إلى 3 إفعل {
كرر_حلقة ب تعيين 1 إلى 2 إفعل {
إطبع("أ يساوي ${أ} - ب يساوي ${ب}") --- طباعة تركيبة القيم من الحلقتين
}
أنهي
}
أنهي
--- استخدام "اكسر" في حلقة داخلية عند ب == 3
كرر_حلقة أ تعيين 1 إلى 3 إفعل {
كرر_حلقة ب تعيين 1 إلى 5 إفعل {
إذا ب == 3 إذن {
اكسر --- كسر الحلقة الداخلية فقط عند ب == 3
}
أنهي
إطبع("أ يساوي ${أ} - ب يساوي ${ب}")
}
أنهي
}
أنهي
--- استخدام "تابع" في الحلقة الداخلية عند ب == 2
كرر_حلقة أ تعيين 1 إلى 3 إفعل {
كرر_حلقة ب تعيين 1 إلى 3 إفعل {
إذا ب == 2 إذن {
تابع --- تخطي الطباعة عند ب == 2
}
أنهي
إطبع("داخل : ب يساوي ${ب}")
}
أنهي
إطبع("خارج : أ يساوي ${أ}")
}
أنهي
--- حلقة متداخلة مع كسر عام باستخدام وسم حلقة
حلقة:
كرر_حلقة أ تعيين 1 إلى 5 إفعل {
كرر_حلقة ب تعيين 1 إلى 5 إفعل {
إذا ((أ == 2) و (ب == 2)) إذن {
اكسر --- كسر مباشر عند تحقق الشرط، ضمن الحلقة المعنونة "حلقة"
}
أنهي
إطبع("أ يساوي ${أ} - ب يساوي ${ب}")
}
أنهي
}
أنهي
--- حلقات متعددة المستوى مع كسر باستخدام وسم خارجي
الخارجي:
كرر_حلقة أ تعيين 1 إلى 5 إفعل {
الأوسط:
كرر_حلقة ب تعيين 1 إلى 5 إفعل {
الداخلي:
كرر_حلقة ت تعيين 1 إلى 5 إفعل {
إذا ((أ == 2) و (ب == 2) و (ت == 2)) إذن {
إطبع("كسر الخارجي : أ يساوي ${أ} - ب يساوي ${ب} - ت يساوي ${ت}")
اكسر الخارجي --- كسر الحلقة الخارجية مباشرة
}
أنهي
إذا ت == 2 إذن {
إطبع("تابع الداخلي : أ يساوي ${أ} - ب يساوي ${ب} - ت يساوي ${ت}")
تابع --- تخطي الطباعة واستكمال الدورة
}
أنهي
إطبع("أ يساوي ${أ} - ب يساوي ${ب} - ت يساوي ${ت}")
}
أنهي
}
أنهي
}
أنهي
--- حلقات متداخلة مع كسر من عدة مستويات حسب الشروط
الخارجي:
كرر_حلقة أ تعيين 1 إلى 5 إفعل {
الأوسط:
كرر_حلقة ب تعيين 1 إلى 5 إفعل {
الداخلي:
كرر_حلقة ت تعيين 1 إلى 5 إفعل {
إذا ((أ == 3) و (ب == 3) و (ت == 3)) إذن {
إطبع("كسر الخارجي : أ يساوي ${أ} - ب يساوي ${ب} - ت يساوي ${ت}")
اكسر الخارجي
}
أنهي
إذا ((أ == 2) و (ب == 2) و (ت == 2)) إذن {
إطبع("كسر الأوسط : أ يساوي ${أ} - ب يساوي ${ب} - ت يساوي ${ت}")
اكسر الأوسط
}
أنهي
إذا ت == 2 إذن {
إطبع("تابع الداخلي : أ يساوي ${أ} - ب يساوي ${ب} - ت يساوي ${ت}")
تابع
}
أنهي
إطبع("أ يساوي ${أ} - ب يساوي ${ب} - ت يساوي ${ت}")
}
أنهي
}
أنهي
}
أنهي
--- استخدام تسمية غير معرفة في "اكسر" => تولّد خطأ
حلقة:
كرر_حلقة أ تعيين 1 إلى 5 إفعل {
حلقة_كسر_غير_صالح:
كرر_حلقة ب تعيين 1 إلى 5 إفعل {
إذا ((أ == 2) و (ب == 2)) إذن {
اكسر حلقة_كسر_غير_صالح --- هذا الاسم غير معرف بشكل صحيح، يجب أن يظهر خطأ
}
أنهي
إطبع("أ يساوي ${أ} - ب يساوي ${ب}")
}
أنهي
}
أنهي
--- حلقة طويلة بدون حد واقعي (2147483647 = max int)
كرر_حلقة أ تعيين 1 إلى 2147483647 إفعل {
إطبع(أ) --- قد تؤدي إلى استهلاك عالي للموارد
}
أنهي
--- استخدام خطوة مخصصة بمقدار 10
كرر_حلقة أ تعيين 1 إلى 500 خطوة 10 إفعل {
إطبع(أ) --- تطبع القيم: 1، 11، 21، ...
}
أنهي
--- خطوة مخصصة 1000 مع حد كبير
كرر_حلقة أ تعيين 1 إلى 2147483647 خطوة 1000 إفعل {
إطبع(أ) --- حلقة واسعة مع خطوة كبيرة
}
أنهي
--- حلقة تنازلية بخطوة 2
كرر_حلقة أ تعيين 1000 تنازليا 1 خطوة 2 إفعل {
إطبع(أ) --- العد التنازلي بخطوتين: 1000، 998، ...
}
أنهي
--- استخدام فاصلة عشرية كخطوة
كرر_حلقة أ تعيين 1 إلى 100 خطوة 0،1 إفعل {
إطبع(أ) --- خطوات عشرية: 1، 1.1، 1.2، ...
}
أنهي
--- تكرار على قائمة مركبة من أنواع مختلفة
كرر_حلقة أ من (1؛"نخيل"؛3،2؛'س'؛خاطئ؛حقيقي؛لاشيء؛(سلسلة_ثمانية_بت "سراب")؛ليس_عددي) إفعل {
إطبع(أ) --- العناصر متنوعة: أرقام، نصوص، منطقية، إلخ
}
أنهي
--- تكرار على مصفوفة باستخدام "داخل"
كرر_حلقة أ داخل [1؛2؛3؛4] إفعل {
إطبع(أ) --- تمر عبر كل عنصر في المصفوفة
}
أنهي
--- تكرار على قائمة مع فهرس وقيمة
كرر_حلقة أ؛ب ضمن {"واحة"،"نخيل"،"ينبوع"،"ظل"} إفعل {
إطبع("${أ} - ${ب}") --- أ = الفهرس، ب = القيمة
}
أنهي
--- تكرار على كائن مفاتيح/قيم باستخدام "من_بين"
كرر_حلقة أ:ب من_بين {"اسم": "أحمد", "عمر": ٢٠, "معدل": ٨٨} إفعل {
إطبع("${أ} - ${ب}") --- أ = المفتاح، ب = القيمة
}
أنهي
--- تكرار على كائن مع مفاتيح وقيم وأسماء متغيرات مخصصة
كرر_حلقة أ؛ب:ت داخل {
متغير الماركة تعيين "بيجو",
متغير الموديل تعيين 2021,
متغير اللون تعيين "أبيض"
} إفعل {
إطبع("${أ} - ${ب} - ${ت}") --- عرض الثلاثي: الفهرس، المفتاح، القيمة
}
أنهي