Φραγμένη συνέχεια

Από τη Βικιπαίδεια, την ελεύθερη εγκυκλοπαίδεια

Στις γλώσσες προγραμματισμού, μια συντιθέμενη συνέχεια (composable continuation), φραγμένη συνέχεια (delimited continuation) ή μερική συνέχεια (partial continuation), είναι ένα τμήμα του πλαισίου στοίβας των συνεχειών που έχει γίνει η επαναφορά του (reification) σε μια συνάρτηση. Σε αντίθεση με τις κανονικές συνέχειες, οι φραγμένες συνέχειες επιστρέφουν τιμή και επομένως μπορούν να ξαναχρησιμοποιηθούν και να συντεθούν ως συναρτήσεις.

Οι φραγμένες συνέχειες μπορούν να υλοποιηθούν με δυο τελεστές, τον shift και τον reset. Ο reset θέτει το όριο που φράσσει τη συνέχεια. Ο shift παίρνει μια συνάρτηση και της περνά τη φραγμένη συνέχεια. Όταν η φραγμένη συνέχεια κληθεί, ο υπολογισμός διακόπτεται και μια τιμή επιστρέφεται από τον shift. Όταν ολόκληρος ο υπολογισμός μέσα στον reset τελειώσει, το αποτέλεσμα επιστρέφεται από τη φραγμένη συνέχεια[1]. Για παράδειγμα, στον παρακάτω κώδικα σε Scheme:

 (reset (* 2 (shift k CODE)))

όταν η CODE καλεί την (k N), αποτιμάται και επιστρέφεται το (* 2 N).

Επιπλέον, όταν όλος ο υπολογισμός μέσα στον shift ολοκληρωθεί, η συνέχεια δε χρησιμοποιείται πια, και η εκτέλεση αρχίζει πάλι εκτός του reset. Επομένως ο,

 (reset (* 2 (shift k (k (k 4)))))

καλεί την (k 4) πρώτα (που επιστρέφει 8), και μετά την (k 8) (που επιστρέφει 16). Σε αυτό το σημείο, η έκφραση shift έχει τελειώσει την εκτέλεσή της και η υπόλοιπη έκφραση reset αγνοείται για το υπόλοιπο του προγράμματος. Το τελικό αποτέλεσμα είναι 16.

Οτιδήποτε συμβαίνει εκτός της έκφρασης reset είναι κρυμμένο. Για παράδειγμα ο ακόλουθος κώδικας επιστρέφει 17:

 (+ 1 (reset (* 2 (shift k (k (k 4))))))

Οι φραγμένες συνέχειες είχαν αρχικά περιγραφεί από τους Felleisen et al.[2] και Johnson.[3] Από τότε έχουν χρησιμοποιηθεί σε πολλά πεδία, ειδικότερα στον ορισμό νέων τελεστών ροής ελέγχου, βλ. Queinnec[4] για μια έρευνα στο αντικείμενο.

Οι φραγμένες συνέχειες είναι επίσης χρήσιμες στη γλωσσολογία: δείτε το άρθρο Συνέχεια για λεπτομέρειες.

Παραπομπές[Επεξεργασία | επεξεργασία κώδικα]

  1. Gasbichler, Martin; Sperber, Michael. "Final Shift for Call/cc: Direct Implementation of Shift and Reset". (Αγγλικά)
  2. Felleisen, Matthias; Friedman, Daniel P.; Duba, Bruce; Marrill, John (February 1987). "Beyond continuations". Technical Report 216. Computer Science Department, Indiana University.
  3. Johnson, Gregory F. "GL: a denotational testbed with continuations and partial continuations", σελ.218–225, Ιούνιος 1987, Proc. SIGPLAN '87 Symposium on Interpreters and Interpretive Techniques
  4. Queinnec, Christian (April 1994). "A library of high-level control operators". École Polytechnique and INRIA-Rocquencourt.

Εξωτερικοί σύνδεσμοι[Επεξεργασία | επεξεργασία κώδικα]