*Scheme 48 Manual* | Contents | In Chapter: Libraries

Previous: Port extensions | Next: Sockets
## Fluid bindings

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`* fluid*_{0} value_{0} fluid_{1} value_{1} ... 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