Когда вы пишете generators
, люди будут думать о концепции generators
в других языках, которые легко могут быть реализованы в Схеме с call/cc
.
(define-coroutine (fib)
(let loop ((a 0) (b 1))
(yield a)
(loop b (+ a b))))
(fib) ; ==> 0
(fib) ; ==> 1
(fib) ; ==> 1
(fib) ; ==> 2
(fib) ; ==> 3
Теперь это похоже на создание степпера из итерации. Это там с потоками и преобразователями. Вы можете создать функции отображения, которые будут составлять последовательные операции, которые будут выполнять расчеты для каждого элемента, вместо того, чтобы выполнять отдельные процессы, генерирующие множество коллекций между ними, как это делала бы цепочка map
. В последние годы JavaScript был одним из важных моментов, связанных с генераторами, поскольку ранние версии await
и async
представляли собой сочетание генераторов и обещаний.
Теперь, если вы думаете больше в более общем смысле, это процедура, которая обрабатывает следующее значение. Вы также можете иметь это:
(define fib
(let ((a 0) (b 1))
(lambda ()
(let ((result a))
(set! a b)
(set! b (+ result b))
result))))
(fib) ; ==> 0
(fib) ; ==> 1
(fib) ; ==> 1
(fib) ; ==> 2
(fib) ; ==> 3
Как видите, это происходит путем обновления личных привязок. Это больше ОО, чем фантазии настоящих генераторов.