Previous: iklib unwind-protect problems, Up: iklib unwind-protect [Index]
call/ccWe have seen that performing a raw escape from an exception handler skips calling the unwind handlers installed in the body:
(import (vicare)
(only (vicare checks)
with-result
add-result))
(with-result
(call/cc
(lambda (escape)
(with-exception-handler
(lambda (E)
(add-result 'exception-handler)
(escape 2))
(lambda ()
(with-unwind-handler
(lambda (why)
(add-result 'unwind-handler))
(lambda ()
(add-result 'body-in)
(raise 1))))))))
⇒ (2 (body-in exception-handler))
this problem can be solved by using unwinding-call/cc rather than
the standard call/cc.
Similar to call/cc, but calling the escape procedure causes the
invocation of the unwind handlers installed in the dynamic environment
up until the saved continuation is restored.
There are limitations:
&non-reinstatable.
&non-reinstatable.
NOTE After some development iterations, the implementation of this primitive has taken a shape quite similar to the function
call/cc-escapingproposed by Will Clinger in http://www.ccs.neu.edu/home/will/UWESC/uwesc.sch.
Usage examples:
(import (vicare)
(only (vicare checks)
with-result
add-result))
(with-result
(unwinding-call/cc
(lambda (escape)
(with-unwind-handler
(lambda (why)
(add-result 'unwind-handler))
(lambda ()
(add-result 'body-in)
(escape 1))))))
⇒ (1 (body-in unwind-handler))
(with-result
(unwinding-call/cc
(lambda (escape)
(with-exception-handler
(lambda (E)
(add-result 'exception-handler)
(escape 2))
(lambda ()
(with-unwind-handler
(lambda (why)
(add-result 'unwind-handler))
(lambda ()
(add-result 'body-in)
(raise 1))))))))
⇒ (2 (body-in exception-handler unwind-handler))
;;Calling unwinding escape procedure from outside the
;;dynamic extent of the call to the receiver.
;;
(let ((escape-proc #f))
(unwinding-call/cc
(lambda (escape)
(set! escape-proc escape)))
(escape-proc))
error→ &non-reinstatable
;;Calling unwinding escape procedure twice.
;;
(let ((again-proc #f))
(unwinding-call/cc
(lambda (escape)
(call/cc
(lambda (again)
(set! again-proc again)))
(escape)))
(again-proc))
error→ &non-reinstatable
Previous: iklib unwind-protect problems, Up: iklib unwind-protect [Index]