These procedures implement dynamic binding and are in structure fluids.
A fluid is a cell whose value can be bound dynamically.
Each fluid has a top-level value that is used when the fluid
 is unbound in the current dynamic environment.
(make-fluid value) -> fluid 
(fluid fluid) -> value 
(let-fluid fluid value thunk) -> value(s) 
(let-fluids fluid0 value0 fluid1 value1 ... thunk) -> value(s) 
Make-fluid returns a new fluid with value as its initial
 top-level value.
Fluid returns fluid's current value.
Let-fluid calls thunk, with fluid bound to value
 until thunk returns.
Using a continuation to throw out of the call to thunk causes
 fluid to revert to its original value, while throwing back
 in causes fluid to be rebound to value.
Let-fluid returns the value(s) returned by thunk.
Let-fluids is identical to let-fluid except that it binds
 an arbitrary number of fluids to new values.
(let* ((f (make-fluid 'a))
       (v0 (fluid f))
       (v1 (let-fluid f 'b
             (lambda ()
               (fluid f))))
       (v2 (fluid f)))
  (list v0 v1 v2))
  -> '(a b a)
(let ((f (make-fluid 'a))
      (path '())
      (c #f))
  (let ((add (lambda ()
               (set! path (cons (fluid f) path)))))
    (add)
    (let-fluid f 'b
      (lambda ()
        (call-with-current-continuation
          (lambda (c0)
            (set! c c0)))
        (add)))
    (add)
    (if (< (length path) 5)
        (c)
        (reverse path))))
  -> '(a b a b a)
Previous: Port extensions | Next: Sockets