Node:Dynamic Wind, Next:, Previous:Error Reporting, Up:Control Mechanisms



26.9 Dynamic Wind

[FIXME: this is pasted in from Tom Lord's original guile.texi and should be reviewed]

dynamic-wind in_guard thunk out_guard Scheme Procedure
scm_dynamic_wind (in_guard, thunk, out_guard) C Function
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