هل يمكن لأي شخص أن يشرح هذا الاستمرار في المخطط؟
-
22-07-2019 - |
سؤال
أنا أتعلم الاستمرارية ولكن لا أستطيع أن ألتف حول هذا الرمز.لماذا يذهب إلى حلقة لا نهاية لها؟
(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)
مرة أخرى.
وهكذا، ما نحصل عليه في نهاية المطاف هو حلقة لا نهاية لها.
لا تنتمي إلى StackOverflow