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