summaryrefslogtreecommitdiff
path: root/modules/language/python/yield.scm
diff options
context:
space:
mode:
Diffstat (limited to 'modules/language/python/yield.scm')
-rw-r--r--modules/language/python/yield.scm97
1 files changed, 66 insertions, 31 deletions
diff --git a/modules/language/python/yield.scm b/modules/language/python/yield.scm
index 569775d..d32ff4b 100644
--- a/modules/language/python/yield.scm
+++ b/modules/language/python/yield.scm
@@ -5,7 +5,7 @@
#:use-module (ice-9 control)
#:use-module (ice-9 match)
#:replace (send)
- #:export (<yield>
+ #:export (<yield>
in-yield define-generator
make-generator
sendException sendClose))
@@ -28,38 +28,73 @@
(fluid-set! in-yield #t)
((apply abort-to-prompt YIELD x)))))))
-(define (make-generator closure)
- (lambda args
- (let ()
- (define obj (make <yield>))
- (define ab (make-prompt-tag))
- (syntax-parameterize ((YIELD (lambda x #'ab)))
- (slot-set! obj 'k #f)
- (slot-set! obj 'closed #f)
- (slot-set! obj 's
- (lambda ()
- (call-with-prompt
- ab
+(define-syntax make-generator
+ (syntax-rules ()
+ ((_ (args ...) closure)
+ (lambda (args ...)
+ (let ()
+ (define obj (make <yield>))
+ (define ab (make-prompt-tag))
+ (syntax-parameterize ((YIELD (lambda x #'ab)))
+ (slot-set! obj 'k #f)
+ (slot-set! obj 'closed #f)
+ (slot-set! obj 's
(lambda ()
- (apply closure yield args)
- (slot-set! obj 'closed #t)
- (throw StopIteration))
- (letrec ((lam
- (lambda (k . l)
- (fluid-set! in-yield #f)
- (slot-set! obj 'k
- (lambda (a)
- (call-with-prompt
- ab
- (lambda ()
- (k a))
- lam)))
- (apply values l))))
- lam))))
- obj))))
+ (call-with-prompt
+ ab
+ (lambda ()
+ (closure yield args ...)
+ (slot-set! obj 'closed #t)
+ (throw StopIteration))
+ (letrec ((lam
+ (lambda (k . l)
+ (fluid-set! in-yield #f)
+ (slot-set! obj 'k
+ (lambda (a)
+ (call-with-prompt
+ ab
+ (lambda ()
+ (k a))
+ lam)))
+ (apply values l))))
+ lam))))
+ obj))))
-(define-syntax-rule (define-generator (f . args) code ...)
- (define f (make-generator args (lambda args code ...))))
+ ((_ (args ... . ***) closure)
+ (lambda (args ... . ***)
+ (let ()
+ (define obj (make <yield>))
+ (define ab (make-prompt-tag))
+ (syntax-parameterize ((YIELD (lambda x #'ab)))
+ (slot-set! obj 'k #f)
+ (slot-set! obj 'closed #f)
+ (slot-set! obj 's
+ (lambda ()
+ (call-with-prompt
+ ab
+ (lambda ()
+ (apply closure yield args ... ***)
+ (slot-set! obj 'closed #t)
+ (throw StopIteration))
+ (letrec ((lam
+ (lambda (k . l)
+ (fluid-set! in-yield #f)
+ (slot-set! obj 'k
+ (lambda (a)
+ (call-with-prompt
+ ab
+ (lambda ()
+ (k a))
+ lam)))
+ (apply values l))))
+ lam))))
+ obj))))))
+
+(define-syntax define-generator
+ (lambda (x)
+ (syntax-case x ()
+ ((_ (f y . args) code ...)
+ #'(define f (make-generator args (lambda (y . args) code ...)))))))
(define-class <yield> () s k closed)