do

تُعدّ do في Scheme آلية تكرار تسمح بالتكرار مع شروط تهيئة وتحديث وإنهاء. تكون مفيدة خصوصًا عند تنفيذ سلسلة عمليات لعدد محدد من المرات أو حتى يتحقق شرط.

الصيغة العامة لـ do:

(do ((var1 init1 update1)
     (var2 init2 update2)
     (var3 init3 update3))
    (termination-condition result)
  body)
  • var: متغير (متغيرات) الحلقة.
  • init: القيمة الأولية لكل متغير حلقة.
  • update: التعبير لتحديث متغيرات الحلقة في نهاية كل تكرار.
  • termination-condition: شرط إيقاف الحلقة.
  • result: القيمة المُرجَعة عند انتهاء الحلقة.
  • body: التعليمات البرمجية المنفّذة في كل تكرار.

مثال: جمع الأرقام من 1 إلى 5

(do ((i 1 (+ i 1))      ; تهيئة i إلى 1، الزيادة بمقدار 1
     (sum 0 (+ sum i))) ; تهيئة sum إلى 0، إضافة i إلى sum
    ((> i 5) sum)       ; الإنهاء عندما i > 5، إرجاع sum
  (lumi-message (number->string sum))) ; طباعة sum في كل خطوة
  • يبدأ i عند 1 ويزيد بمقدار 1 في كل تكرار.
  • sum يجمع مجموع i.
  • تنتهي الحلقة عند i > 5، فتُرجع القيمة النهائية لـ sum.

الإخراج: 15


كيف يعمل

  1. التهيئة:

    • تُعيَّن قيمة أولية لكل متغير حلقة.
  2. فحص الإنهاء:

    • في بداية كل تكرار، يُفحص شرط الإنهاء. إذا كان صحيحًا، تتوقف الحلقة ويُقيَّم تعبير النتيجة.
  3. التكرار:

    • إذا كان شرط الإنهاء خاطئًا، يُنفَّذ النص ويُحدَّث متغيرات الحلقة بتعبيرات التحديث.

ملخص

  • do طريقة مرنة لتنفيذ حلقات بمتغيرات متعددة وشروط إنهاء معقدة.
  • مفيد للمهام التي تتطلب تحديثات حالة عبر التكرارات.
  • شرط الإنهاء يحدّد متى تنتهي الحلقة ويمكنه إرجاع النتيجة النهائية.

باستخدام do، يمكنك تنفيذ خوارزميات تكرارية في Scheme مع تحكم دقيق في التهيئة والتحديثات والإنهاء. هذا يجعل do مزيجًا من آلية ربط محددة النطاق (مثل let) وبنية تحكم تكرارية، ما يُمكّنها من التعامل مع حالة التكرار والحالة المؤقتة بطريقة نظيفة وموجزة.