Go to the first, previous, next, last section, table of contents.


Dynamic Wind

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

primitive: dynamic-wind in-guard thunk out-guard
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


Go to the first, previous, next, last section, table of contents.