Dynamic Wind
============
[FIXME: this is pasted in from Tom Lord's original guile.texi and should
be reviewed]
- primitive: dynamic-wind thunk1 thunk2 thunk3
All three arguments must be 0-argument procedures.
IN-GUARD is called, then THUNK, then OUT-GUARD.
If, any time during the execution of THUNK, the continuation of
the `dynamic-wind' expression is escaped non-locally, OUT-GUARD is
called. If the continuation of the dynamic-wind is re-entered,
IN-GUARD is called. Thus IN-GUARD and OUT-GUARD may be called
any number of times.
(define x 'normal-binding)
=> x
(define a-cont (call-with-current-continuation
(lambda (escape)
(let ((old-x x))
(dynamic-wind
;; in-guard:
;;
(lambda () (set! x 'special-binding))
;; thunk
;;
(lambda () (display x) (newline)
(call-with-current-continuation escape)
(display x) (newline)
x)
;; out-guard:
;;
(lambda () (set! x old-x)))))))
;; Prints:
special-binding
;; Evaluates to:
=> a-cont
x
=> normal-binding
(a-cont #f)
;; Prints:
special-binding
;; Evaluates to:
=> a-cont ;; the value of the (define a-cont...)
x
=> normal-binding
a-cont
=> special-binding
automatically generated byinfo2wwwversion 1.2.2.9