Scheme 48 Manual | Contents | In Chapter: Libraries
Previous: Fluid bindings | Next: Fluid bindings

## 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 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