From e5fd8a904c19db9f5ee0df2129419db52b9dedee Mon Sep 17 00:00:00 2001 From: Jon Rafkind Date: Mon, 8 Feb 2010 19:47:41 +0000 Subject: [PATCH] document latest generator functionality svn: r18022 --- .../scribblings/reference/sequences.scrbl | 58 ++++++++++++++++++- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/collects/scribblings/reference/sequences.scrbl b/collects/scribblings/reference/sequences.scrbl index 5609e629e0..f75567b0c1 100644 --- a/collects/scribblings/reference/sequences.scrbl +++ b/collects/scribblings/reference/sequences.scrbl @@ -392,8 +392,62 @@ completes, the generator will end. i) ]} -@defform[(yield expr)]{ Saves the point of execution inside a generator -and returns a value.} +@defform[(yield expr ...)]{ Saves the point of execution inside a generator +and returns a value. @scheme[yield] can accept any number of arguments and will +return them using @scheme[values]. + +Values can be passed back to the generator after invoking @scheme[yield] by passing +the arguments to the generator instance. Note that a value cannot be passed back +to the generator until after the first @scheme[yield] has been invoked. + +@examples[#:eval (generator-eval) +(define my-generator (generator (yield 1) (yield 2 3 4))) +(my-generator) +(my-generator) +] + +@examples[#:eval (generator-eval) +(define pass-values-generator + (generator + (let* ([from-user (yield 2)] + [from-user-again (yield (add1 from-user))]) + (yield from-user-again)))) + +(pass-values-generator) +(pass-values-generator 5) +(pass-values-generator 12) +]} + +@defproc[(generator-state [g any?]) symbol?]{ Returns a symbol that describes the state +of the generator. + + @itemize[ + @item{@scheme['fresh] - The generator has been freshly created and has not + been invoked yet. Values cannot be passed to a fresh generator.} + @item{@scheme['suspended] - Control within the generator has been suspended due + to a call to @scheme[yield]. The generator can be invoked.} + @item{@scheme['running] - The generator is currently executing. This state can + only be returned if @scheme[generator-state] is invoked inside the generator.} + @item{@scheme['done] - The generator has executed its entire body and will not + call @scheme[yield] anymore.} + ] + +@examples[#:eval (generator-eval) +(define my-generator (generator (yield 1) (yield 2))) +(generator-state my-generator) +(my-generator) +(generator-state my-generator) +(my-generator) +(generator-state my-generator) +(my-generator) +(generator-state my-generator) + +(define introspective-generator (generator ((yield 1)))) +(introspective-generator) +(introspective-generator (lambda () (generator-state introspective-generator))) +(generator-state introspective-generator) +(introspective-generator) +]} @defproc[(sequence->generator [s sequence?]) (-> any?)]{ Returns a generator that returns elements from the sequence, @scheme[s], each time the generator