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

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


14.4.6 Example 1: A Serial Number Generator

14.4.6 Пример 1: Генератор порядового номера

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 создаёт новое локальное окружение и возвращает новый объект, содержащий процедуру с соответствующим ей окружением.


> > далее > >