Name: Anonymous 2005-12-21 8:09
Because I'm learning it, almost done through the tutorial, and it looks great.
yield procedure, instead of passing it as an argument, but that's doable too.
(define (yield . xs)
(shift k (cons k xs)))
(define ((generator f) . xs)
(reset (apply f xs) #f))
(define ((generator/yield-arg f) . xs)
(reset (f yield) #f))
(define ((fioc-generator-of gen) f)
(let ((g (gen f)))
(lambda ()
(let ((next (g)))
(set! g (car next))
(apply values (cdr next))))))
(define fioc-generator (fioc-generator-of generator))
(define fioc-generator/yield-arg (fioc-generator-of generator/yield-arg))
(define g
(fioc-generator
(lambda ()
(for-each yield '(1 2 3 4)))))
(g) ; 1
(g) ; 2
(g) ; 3
(define g2
(generator/yield-arg
(lambda (yield)
(for-each yield '(1 2 3 4)))))
(g2) ; (cont . (1))
((car (g2))) ; (cont . (2))
((car ((car (g2))))) ; (cont . (3))
((car (g2))) ; (cont . (2))
(define g3
(fioc-generator/yield-arg
(lambda (yield)
(for-each yield '(1 2 3 4)))))
(g3) ; 1
(g3) ; 2
(g3) ; 3