هل يمكن تنفيذ استدعاء الاتصال مع Call-Current فقط مع Lambdas والإغلاق؟
-
26-09-2019 - |
سؤال
لا أحد يعرف إذا call/cc
يمكن تنفيذها مع lambdas فقط والإغلاق؟
يبدو أن call/cc
يقطع تدفق البرنامج (مثل استثناء) ولكن Lambdas والإغلاق لا يمكن أن تفعل ذلك. لذلك أعتقد call/cc
لا يمكن تنفيذها عبر lambdas والإغلاق.
هل هناك المزيد من الأفكار؟
المحلول
السؤال غير واضح بشكل خاص ، لأن ما الذي يعنيه "تطبيق Lambdas والإغلاق" بالضبط؟
على أي حال ، يمكن استخدام الاستمرارية في أي لغة مع إغلاق من خلال الكتابة يدويًا في نمط تمرير الاستمرار. ثم يمكن تنفيذ الترجمة التلقائية إلى هذا النموذج عن طريق توسيع المترجم ، والذي يسمح عادةً على مستوى المستخدم من خلال وحدات الماكرو. على سبيل المثال انظر CL-CONT, ، مكتبة تنفذ الاستمرارية لـ LISP المشتركة ، وهي لغة لا تضمنها.
من المحتمل أن يتم تنفيذ الاستمرارات المنتشرة الفعالة كما هو الحال في المخطط على مستوى أقل تتعامل مباشرة مع مكدس البرنامج ، ولكن هذا ليس شرطًا ، مجرد تحسين.
نصائح أخرى
في المخطط يمكنك تنفيذها call/cc
باستخدام lambdas عند التحويل إلى نمط تمرير الاستمرار (CPS). عند التحويل إلى CPS ، كل حدث call/cc
يمكن استبداله بما يعادل ما يلي:
(lambda (f k) (f (lambda (v k0) (k v)) k))
أين k
هو استمرار أن يتم إنقاذه ، و (lambda (v k0) (k v))
هو إجراء الهروب الذي يعيد هذا الاستمرار (مهما كان الاستمرار k0
هذا نشط عندما يطلق عليه ، يتم التخلص منه).
لذلك ، للإجابة على سؤالك للمخطط: نعم ، يمكن القيام به.