Node:Пример: порядковый номер,
Next:Общая переменная,
Previous:Замыкание,
Up:О замыкании
[Показать/скрыть оригинал] [Показать/скрыть перевод] [Переключить перевод и оригинал]
This example uses closure to create a procedure with a variable binding that is private to the procedure, like a local variable, but whose value persists between procedure calls.
Этот пример использует замыкание для создания процедуры, в которой есть
локальная привязка перменной. Эта переменная очень похожа на локальную переменную, за исключением
того, что значение переменной сохраняется между вызовами.
(define (make-serial-number-generator)
(let ((current-serial-number 0))
(lambda ()
(set! current-serial-number (+ current-serial-number 1))
current-serial-number)))
(define entry-sn-generator (make-serial-number-generator))
(entry-sn-generator)
=>
1
(entry-sn-generator)
=>
2
When make-serial-number-generator is called, it creates a local
environment with a binding for current-serial-number whose
initial value is 0, then, within this environment, creates a procedure.
The local environment is stored within the created procedure object and
so persists for the lifetime of the created procedure.
Когда вызывается make-serial-number-generator, он
создаёт локальное окружение с привязкой current-serial-number с начальным
значением 0. Затем, внутри этого окружения создаёт процедуру. Локальное окружение
сохраняется в объекте, содержащем процедуру, и таким образом сохраняется на весь
срок жизни созданной переменной.
Every time the created procedure is invoked, it increments the value of
the current-serial-number binding in the captured environment and
then returns the current value.
Каждый раз, когда созданная процедура вызывается, она увеличивает
значение current-serial-number на единицу и возвращает текущее значение.
Значение хранится в привязке в "захваченном" окружении.
Note that make-serial-number-generator can be called again to
create a second serial number generator that is independent of the
first. Every new invocation of make-serial-number-generator
creates a new local let environment and returns a new procedure
object with an association to this environment.
Заметим, что make-serial-number-generator может быть
вызван снова, для создания второго генератора последовательных номеров, незвависимого от первого.
Каждый новый вызов make-serial-number-generator создаёт новое локальное окружение и возвращает
новый объект, содержащий процедуру с соответствующим ей окружением.
> > далее > >