smalltalk-tng
view experiments/bidi-generator.ss @ 323:454c18798969
merger
| author | Tony Garnock-Jones <tonygarnockjones@gmail.com> |
|---|---|
| date | Tue Feb 07 11:34:20 2012 -0500 (3 months ago) |
| parents | |
| children |
line source
1 #lang scheme
3 (provide yield generator)
5 (define current-yielder
6 (make-parameter
7 (lambda (v)
8 (error 'yield "must be called in the context of a generator"))))
10 (define (yield . vals)
11 (apply (current-yielder) vals))
13 (define-syntax-rule (generator init-formals body0 body ...)
14 (letrec ((yielder (lambda vals
15 (call-with-current-continuation
16 (lambda (new-inner-k)
17 (set! inner-k new-inner-k)
18 (apply outer-k vals)))))
19 (outer-k #f)
20 (inner-k (lambda init-formals
21 (call-with-values
22 (lambda ()
23 (parameterize ((current-yielder yielder))
24 body0 body ...))
25 (lambda results
26 (set! inner-k (lambda ignored (error "Generator is terminated")))
27 (apply outer-k results))))))
28 (lambda args
29 (call-with-current-continuation
30 (lambda (new-outer-k)
31 (set! outer-k new-outer-k)
32 (apply inner-k args))))))
