Copyright (C) 2000-2012 |
GNU Info (guile.info)Dynamic WindDynamic 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 |