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: Fluid bindings | Next: Fluid bindings