DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH
 

(guile.info.gz) Shared Variable

Info Catalog (guile.info.gz) Serial Number (guile.info.gz) About Closure (guile.info.gz) Callback Closure
 
 14.4.7 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
 
    An important 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.
 
Info Catalog (guile.info.gz) Serial Number (guile.info.gz) About Closure (guile.info.gz) Callback Closure
automatically generated byinfo2html