سؤال

هذا يرتبط ما هو الاتصال / CC؟, لكنني لم أكن أرغب في اختطاف هذا السؤال لأغراضي الخاصة، وبعض حججها مثل القياس ل SetJMP / LongJMP تهربني.

أعتقد أن لدي فكرة كافية حول ما هو استمرار، أفكر في الأمر بمثابة لقطة من مكدس المكالمة الحالية. لا أريد أن أذهب إلى المناقشة لماذا قد يكون هذا مثيرا للاهتمام أو ما يمكنك القيام به مع استمرار. سؤالي هو أكثر تحديدا، لماذا يجب علي تقديم وسيطة دالة للاتصال / CC؟ لماذا لا تتصل / CC فقط بإرجاع استمرار الحالي، لذلك يمكنني أن أفعل كل ما أريد معه (قم بتخزينه، أو الاتصال به، فأنت تسميته)؟ في رابط من هذا السؤال الآخر (http://community.schemewiki.org/؟call-with-current-continuation-for-cprogrammers.)، فإنه يتحدث عن "أساسا مجرد طريقة نظيفة للحصول على الاستمرار لك والاستمرار في الخروج من القفزات اللاحقة مرة أخرى إلى النقطة المحفوظة."، لكنني لا أحصل عليه. يبدو معقدا دون داع.

هل كانت مفيدة؟

المحلول 4

ضد المشتركة، لذا، أجب على سؤالي، ولكن أكثر من محرر من مزود الإجابة.

بعد فترة بدأت سؤال مماثل في لتل. وبعد بعد كل شيء، هؤلاء هم الرجال الذين يفكرون في تصميم اللغة طوال اليوم، أليسوا، واحدا من إجابات أخيرا ركل معي. الآن الأشياء المذكورة هنا، على سبيل المثال إيلي أو في السؤال الأصلي، جعل أكثر منطقية بالنسبة لي. الأمر كله يتعلق بما يتم تضمينه في الاستمرار، وحيث يحدد المستمر التطبيقي.

واحد من الملصقات كتبت في LTU:

"يمكنك أن ترى بالضبط كيف يسمح لك دعوة / CC" في الخارج. "مع EM أو GET / CC، تحتاج إلى القيام بشيء من الاختبار لتحديد ما إذا كان لديك قفزة خلفية أو مجرد الدعوة الأولية. في الأساس ، تحتفظ Call / CC باستخدام الاستمرار من الاستمرار، بينما مع الحصول على / CC أو EM، يحتوي استمرار استخدامه، وهكذا (عادة) تحتاج إلى إضافة اختبار إلى بداية الاستمرار (أي مباشرة بعد الحصول عليها مباشرة / CC / EM) لفصل "استخدام أجزاء الاستمرارية" من أجزاء "بقية المستمر".

التي قادها المنزل بالنسبة لي.

شكرا لك يا رفاق على أي حال!

نصائح أخرى

إذا كنت تستخدم بناء مثل Jay Shows، فيمكنك الاستيلاء على الاستمرار، ولكن بطريقة ما، تكون القيمة التي أمسك بها بالفعل لأنك بالفعل داخل هذا الاستمرار. في المقابل، call/cc يمكن استخدامها للاستيلاء على استمرار ذلك ما يزال في حين خارج التعبير الحالي. على سبيل المثال، أحد أبسط استخدامات المستمرات هو تطبيق نوع من abort:

(call/cc (lambda (abort)
           (+ 1 2 (abort 9))))

لا يمكنك أن تفعل ذلك مع العملية التي تصفها. إذا حاولت ذلك:

(define (get-cc) (call/cc values))
(let ([abort (get-cc)]) (+ 1 2 (abort 9)))

ثم تحصل على خطأ في التقدم 9 كإجراء. يحدث هذا بسبب abort يقفز مرة أخرى إلى let مع القيمة الجديدة لل 9 - مما يعني أنك تقوم الآن بالجولة الثانية من تعبير الإضافة نفسها، إلا أن ذلك الآن abort لا بد أن 9...

اثنين من الملاحظات الإضافية ذات الصلة:

  1. للحصول على مقدمة عملية لطيفة في المستمرات، انظر باناي.
  2. call/cc يكون معقدة قليلا في ذلك يستغرق في وظيفة - أسهل من الناحية النظرية let/cc التي يمكنك أن تجدها في بعض التطبيقات مثل مخطط PLT. المثال أعلاه يصبح (let/cc abort (+ 1 2 (abort 9))).

سيكون ذلك أقل تنوعا. إذا كنت تريد هذا السلوك، يمكنك فقط القيام:

(call/cc (lambda (x) x))

هل يمكن أن نلقي نظرة على مثال على استخدامات المستمرات في "Darrell Ferguson و dwight deugo." اتصل بأنماط استمرارية الحالية ". المؤتمر الثامن حول لغة النمط للبرامج. سبتمبر 2001." فيhttp://library.readscheme.org/page6.html.) وحاول إعادة كتابةها باستخدام مكالمة / CC- عودة، المعرفة على النحو الوارد أعلاه.

أقترح بدءا من خلال طرح نفسك: ماذا يعني أن يكون استمرارا من الدرجة الأولى؟

يتكون استمرار تعبير أساسا من قطعتين من البيانات: أولا، الإغلاق (أي البيئة) لهذا التعبير؛ وثانيا، تمثيل ما ينبغي القيام به مع نتيجة التعبير. لغة ذات مستمرات من الدرجة الأولى، إذن، هي واحدة لديها هياكل البيانات تتغلف عن هذه الأجزاء، والتي تعالج هياكل البيانات هذه تماما كما تفعل أي شيء آخر.

Call / CC هو وسيلة أنيقة بشكل خاص لتحقيق هذه الفكرة: يتم تعبئتها استمرار الحالي كإجراء يغلف مع التعبير مع التعبير مع التعبير كما يفعل الإجراء عند تطبيقه على التعبير؛ لتمثيل استمرار هذه الطريقة تعني ببساطة أن إغلاق هذا الإجراء يحتوي على البيئة في الموقع تم استدعاءه.

يمكنك أن تتخيل تحقيق فكرة استمرار الدرجة الأولى بطرق أخرى. لن يتم الاتصال / CC، ومن الصعب علي أن أتخيل كيف يمكن أن يكون مثل هذا التمثيل أبسط.

في ملاحظة فراق، فكر في تنفيذ اسم السماح الذي ذكره إيلي، الذي أفضله لاستدعاء BIND / CC:

(define-syntax bind/cc
    (syntax-rules ()
        ((bind/cc var . body)
             (call/cc (lambda (var) . body)))))

وكمركز تمرين، كيف يمكنك تنفيذ المكالمة / CC بناء على BIND / CC؟

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