سؤال

أنا أتعلم الاستمرارية ولكن لا أستطيع أن ألتف حول هذا الرمز.لماذا يذهب إلى حلقة لا نهاية لها؟

(let ((cont #f))
  (call/cc (lambda (k)
             (set! cont k)))
  (cont #f))
هل كانت مفيدة؟

المحلول

سطراً سطراً:

  • نحدد المتغير المحلي cont
  • نحن نسمي مع الاستمرار الحالي بعض وظائف لامدا، أي أننا نمرر الاستمرار الحالي إلى وظيفة لامدا كوسيطة.الاستمرارية الحالية هي دالة لوسيطة واحدة، ثم يتم استخدام هذه الوسيطة كـ "قيمة إرجاع" لـ call/cc (وهنا يتم تجاهله في النهاية).
  • لذا k هنا يدل على كل ما سيحدث بعد ذلك، في حالتنا شيء قريب من المعنى (lambda (call/cc-retval) (let () call/cc-retval (cont #f))).وضعنا cont قيمة لهذا الاستمرار. call/cc عائدات.
  • منذ cont هي الآن دالة تمثل الاستمرارية، ووسيطتها هي "القيمة المرجعة لـ call/cc"، نحن فقط نسمي هذه الوظيفة، ويتم تجاهل الوسيطة، ونحتاج إلى استدعاء (cont #f) مرة أخرى.

وهكذا، ما نحصل عليه في نهاية المطاف هو حلقة لا نهاية لها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top