Next: iklib unwind-protect reenter, Previous: iklib unwind-protect returnable, Up: iklib unwind-protect [Index]
Using the unwind–protection mechanism with coroutines is fine;
coroutines use yield
to save the current continuation, give
control to the next coroutine and come back later; this mechanism does
not cause the ?unwind-handler evaluation.
The following sample code finishes with the given return values and lines printed:
(import (vicare)) (define (print template . args) (apply fprintf (current-error-port) template args) (yield)) (define a #f) (define b #f) (define c #f) (concurrently (lambda () (unwind-protect (begin (set! a 1.1) (print "unwind-protect sub 1.1: ~a\n" a) (set! a 1.2) (print "unwind-protect sub 1.2: ~a\n" a) (set! a 1.3) (print "unwind-protect sub 1.3: ~a\n" a)) (set! a 1.4))) (lambda () (unwind-protect (begin (set! b 2.1) (print "unwind-protect sub 2.1: ~a\n" b) (set! b 2.2) (print "unwind-protect sub 2.2: ~a\n" b) (set! b 2.3) (print "unwind-protect sub 2.3: ~a\n" b)) (set! b 2.4))) (lambda () (unwind-protect (begin (set! c 3.1) (print "unwind-protect sub 3.1: ~a\n" c) (set! c 3.2) (print "unwind-protect sub 3.2: ~a\n" c) (set! c 3.3) (print "unwind-protect sub 3.3: ~a\n" c)) (set! c 3.4)))) (values a b c) ⇒ 1.4 2.4 3.4 -| unwind-protect sub 1.1: 1.1 -| unwind-protect sub 2.1: 2.1 -| unwind-protect sub 1.2: 1.2 -| unwind-protect sub 3.1: 3.1 -| unwind-protect sub 2.2: 2.2 -| unwind-protect sub 1.3: 1.3 -| unwind-protect sub 3.2: 3.2 -| unwind-protect sub 2.3: 2.3 -| unwind-protect sub 3.3: 3.3