GNU Info

Info Node: (guile.info)Shared Variable

(guile.info)Shared Variable


Next: Callback Closure Prev: Serial Number Up: About Closure
Enter node , (file) or (file)node

Example 2: A Shared Persistent Variable
---------------------------------------

This example uses closure to create two procedures, `get-balance' and
`deposit', that both refer to the same captured local environment so
that they can both access the `balance' variable binding inside that
environment.  The value of this variable binding persists between calls
to either procedure.

Note that the captured `balance' variable binding is private to these
two procedures: it is not directly accessible to any other code.  It
can only be accessed indirectly via `get-balance' or `deposit', as
illustrated by the `withdraw' procedure.

     (define get-balance #f)
     (define deposit #f)
     
     (let ((balance 0))
       (set! get-balance
             (lambda ()
               balance))
       (set! deposit
             (lambda (amount)
               (set! balance (+ balance amount))
               balance)))
     
     (define (withdraw amount)
       (deposit (- amount)))
     
     (get-balance)
     =>
     0
     
     (deposit 50)
     =>
     50
     
     (withdraw 75)
     =>
     -25

A detail here is that the `get-balance' and `deposit' variables must be
set up by `define'ing them at top level and then `set!'ing their values
inside the `let' body.  Using `define' within the `let' body would not
work: this would create variable bindings within the local `let'
environment that would not be accessible at top level.


automatically generated by info2www version 1.2.2.9