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
This commit is contained in:
parent
f1dcf49d38
commit
2f62cb192e
|
@ -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])
|
||||
|
|
Loading…
Reference in New Issue
Block a user