هل يمكن تنفيذ استدعاء الاتصال مع Call-Current فقط مع Lambdas والإغلاق؟

StackOverflow https://stackoverflow.com/questions/3811448

سؤال

لا أحد يعرف إذا 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 هذا نشط عندما يطلق عليه ، يتم التخلص منه).

لذلك ، للإجابة على سؤالك للمخطط: نعم ، يمكن القيام به.

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