From 2f62cb192ef8bfdc3b66dade337d327e87078947 Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Fri, 5 Feb 2010 03:22:07 +0000 Subject: [PATCH] Allow using `yield' with any number of arguments which will be returned as multiple values. (These `case-lambda's are for making it fast, which is probably stupid given how slow this is anyway.) svn: r17981 --- collects/scheme/generator.ss | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/collects/scheme/generator.ss b/collects/scheme/generator.ss index 27f08bc027..03cc85c53c 100644 --- a/collects/scheme/generator.ss +++ b/collects/scheme/generator.ss @@ -44,16 +44,21 @@ (lambda (v) (error 'yield "must be called in the context of a generator")))) -(define (yield value) - ((current-yielder) value)) +(define yield + (case-lambda [() ((current-yielder))] + [(v) ((current-yielder) v)] + [vs (apply (current-yielder) vs)])) (define yield-tag (make-continuation-prompt-tag)) (define-syntax-rule (generator body0 body ...) (let ([state 'fresh]) (define (cont) - (define (yielder value) - (shift-at yield-tag k (set! cont k) value)) + (define yielder + (case-lambda + [() (shift-at yield-tag k (set! cont k) (values))] + [(v) (shift-at yield-tag k (set! cont k) v)] + [vs (shift-at yield-tag k (set! cont k) (apply values vs))])) (set! state 'running) (reset-at yield-tag (parameterize ([current-yielder yielder])