GNU Info

Info Node: (guile.info)Dynamic Wind

(guile.info)Dynamic Wind


Prev: Error Reporting Up: Control Mechanisms
Enter node , (file) or (file)node

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 by info2www version 1.2.2.9