Node:Общая переменная, Next:, Previous:Пример: порядковый номер, Up:О замыкании

[Показать/скрыть оригинал] [Показать/скрыть перевод] [Переключить перевод и оригинал]


14.4.7 Example 2: A Shared Persistent Variable

14.4.7 Пример 2: Общая перманентная переменная

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.

Этот пример использует замыкание для создания двух процедур (get-balance и deposit) использующих одно и тоже захваченное локальное окружение. Благодаря этому они обе имеют доступ к привязке переменной balance внутри этого окружения. Значение привязки переменной сохраняется между вызовами процедур.

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.

Заметим, что захваченная привязка переменной balance является "приватной" для этих двух процедур, она не доступна никому за их пределами. Доступ к ней можно получить косвенно только через get-balance или deposit, как показано на примере процедуры withdraw.

(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 defineing 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.

Важная деталь: переменные get-balance и deposit должны быть установлены конструкцией define на верхнем уровне, и затем установлены в начальные значения конструкцией set! внутри тела let. Использование define внутри let не сработает: оно создаст привязку переменной внутри локального окружения let, которое не будет доступно на верхнем уровне (вне тела let).


> > далее > >