Node:Общая переменная,
Next:Замыкания и обратный вызов,
Previous:Пример: порядковый номер,
Up:О замыкании
[Показать/скрыть оригинал] [Показать/скрыть перевод] [Переключить перевод и оригинал]
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).
> > далее > >