document generator forms
svn: r15833
This commit is contained in:
parent
e0395f6d68
commit
19de92f5fd
|
@ -1,7 +1,8 @@
|
||||||
#lang scribble/doc
|
#lang scribble/doc
|
||||||
@(require "mz.ss"
|
@(require "mz.ss"
|
||||||
(for-syntax scheme/base)
|
(for-syntax scheme/base)
|
||||||
scribble/scheme)
|
scribble/scheme
|
||||||
|
(for-label scheme/generator))
|
||||||
|
|
||||||
@(define-syntax speed
|
@(define-syntax speed
|
||||||
(syntax-rules ()
|
(syntax-rules ()
|
||||||
|
@ -10,6 +11,12 @@
|
||||||
@elem[what]
|
@elem[what]
|
||||||
iteration when it appears directly in a @scheme[for] clause.}]))
|
iteration when it appears directly in a @scheme[for] clause.}]))
|
||||||
|
|
||||||
|
@(define generator-eval
|
||||||
|
(lambda ()
|
||||||
|
(let ([the-eval (make-base-eval)])
|
||||||
|
(the-eval '(require scheme/generator))
|
||||||
|
the-eval)))
|
||||||
|
|
||||||
@title[#:tag "sequences"]{Sequences}
|
@title[#:tag "sequences"]{Sequences}
|
||||||
|
|
||||||
@guideintro["sequences"]{sequences}
|
@guideintro["sequences"]{sequences}
|
||||||
|
@ -296,3 +303,60 @@ second returns the next element (which may be multiple values) from the
|
||||||
sequence; if no more elements are available, the
|
sequence; if no more elements are available, the
|
||||||
@exnraise[exn:fail:contract].}
|
@exnraise[exn:fail:contract].}
|
||||||
|
|
||||||
|
@section{Iterator Generators}
|
||||||
|
@defmodule[scheme/generator]
|
||||||
|
@defform[(generator body ...)]{ Create a function that returns a
|
||||||
|
value, usually through @scheme[yield], each time it is invoked. When
|
||||||
|
the generator runs out of values to yield the last value it computed
|
||||||
|
will be returned for future invocations of the generator. Generators
|
||||||
|
can be safely nested.
|
||||||
|
|
||||||
|
@examples[#:eval (generator-eval)
|
||||||
|
(define g (generator
|
||||||
|
(let loop ([x '(a b c)])
|
||||||
|
(if (null? x)
|
||||||
|
0
|
||||||
|
(begin
|
||||||
|
(yield (car x))
|
||||||
|
(loop (cdr x)))))))
|
||||||
|
(g)
|
||||||
|
(g)
|
||||||
|
(g)
|
||||||
|
(g)
|
||||||
|
(g)
|
||||||
|
]
|
||||||
|
|
||||||
|
To use an existing generator as a sequence you should use @scheme[in-producer]
|
||||||
|
with a stop-value known to the generator.
|
||||||
|
|
||||||
|
@examples[#:eval (generator-eval)
|
||||||
|
(define my-stop-value (gensym))
|
||||||
|
(define my-generator (generator
|
||||||
|
(let loop ([x '(a b c)])
|
||||||
|
(if (null? x)
|
||||||
|
my-stop-value
|
||||||
|
(begin
|
||||||
|
(yield (car x))
|
||||||
|
(loop (cdr x)))))))
|
||||||
|
|
||||||
|
(for/list ([i (in-producer my-generator my-stop-value)])
|
||||||
|
i)
|
||||||
|
]}
|
||||||
|
|
||||||
|
@defproc[(in-generator [expr any?] ...) sequence?]{ Return a generator
|
||||||
|
that can be used as a sequence. @scheme[in-generator] takes care of the
|
||||||
|
case when @scheme[expr] stops producing values so when the @scheme[expr]
|
||||||
|
completes the generator will end.
|
||||||
|
|
||||||
|
@examples[#:eval (generator-eval)
|
||||||
|
(for/list ([i (in-generator
|
||||||
|
(let loop ([x '(a b c)])
|
||||||
|
(when (not (null? x))
|
||||||
|
(yield (car x))
|
||||||
|
(loop (cdr x)))))])
|
||||||
|
i)
|
||||||
|
]}
|
||||||
|
|
||||||
|
@defform[(yield expr)]{ Save the point of execution inside a generator
|
||||||
|
and return a value.}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user