From e077b87d503969029deee6f3cd8094d567c8b438 Mon Sep 17 00:00:00 2001 From: Jon Rafkind Date: Tue, 24 Aug 2010 00:11:22 -0600 Subject: [PATCH] fix PR 11123: 0-ary generator yield --- collects/racket/generator.rkt | 3 +++ collects/racket/private/for.rkt | 26 ++++++++++++++++++++++++++ collects/tests/racket/for.rktl | 7 +++++++ 3 files changed, 36 insertions(+) diff --git a/collects/racket/generator.rkt b/collects/racket/generator.rkt index 1ce50ac7e4..8932b797ac 100644 --- a/collects/racket/generator.rkt +++ b/collects/racket/generator.rkt @@ -112,6 +112,9 @@ (in-producer (generator () body0 body ... stop-value) stop-value)]) (lambda (stx) (syntax-case stx () + [(() (_ body0 body ...)) + #'[() + (in-producer (generator () body0 body ... stop-value) stop-value)]] [((id ...) (_ body0 body ...)) (with-syntax ([(stops ...) (syntax-case #'((id stop-value) ...) () [((x v) ...) #'(v ...)])]) diff --git a/collects/racket/private/for.rkt b/collects/racket/private/for.rkt index 5cd17719bd..925878d06b 100644 --- a/collects/racket/private/for.rkt +++ b/collects/racket/private/for.rkt @@ -1281,6 +1281,32 @@ #t ;; loop args ())])] + [[() (_ producer stop more ...)] + (with-syntax ([(more* ...) (generate-temporaries #'(more ...))]) + #'[() + (:do-in + ([(producer*) producer] [(more*) more] ... + [(stop?) (let ([s stop]) + (if (procedure? s) + s + (lambda (args) + (and (not (null? args)) + (eq? (car args) s)))))]) + ;; outer check + #t + ;; loop bindings + () + ;; pos check + #t + ;; inner bindings + ([(check) (call-with-values (lambda () (producer* more* ...)) + (lambda vs vs))]) + ;; pre guard + (not (stop? check)) + ;; post guard + #t + ;; loop args + ())])] ;; multiple-values version [[(id ...) (_ producer stop more ...)] (with-syntax ([(more* ...) (generate-temporaries #'(more ...))]) diff --git a/collects/tests/racket/for.rktl b/collects/tests/racket/for.rktl index cd0ed75a4a..9123a7cfd6 100644 --- a/collects/tests/racket/for.rktl +++ b/collects/tests/racket/for.rktl @@ -242,6 +242,7 @@ (for/list ([(x i) (in-indexed (in-generator (yield 1) (yield 2) (yield 3)))]) (list x i))) +;; test multiple values for in-generator (test '[(1 2) (3 4)] 'for*-generator (for*/list ([(n after) (in-generator @@ -249,6 +250,12 @@ (yield 3 4))]) (list n after))) +;; test 0-ary yields +(test '(0 1 2) 'no-bind-in-generator + (for/list ([() (in-generator (yield) (yield) (yield))] + [i (in-naturals)]) + i)) + (let ([helper (lambda (i) (yield (add1 i)))]) (test '(1 2 3) 'parameterized-yield