[plt-scheme] Re: yield-oriented sequence constructor
On Mar 21, Doug Orleans wrote:
>
> Here's a much simpler version of make-yield-sequence, though it
> seems kinda like voodoo to me. I'm wondering if I can just lift
> this yield to the top level and get rid of the parameter altogether,
> but then how do I install the default behavior in a top-level
> prompt?
Seems like voodoo to me too, but is there really a need for a
parameter?
BTW, there is a `function-iterator' in Swindle, which sort of
translates to this (modulo the voodooness, so I won't be surprised if
this is doing something horribly wrong):
(define (iter fun finally)
(define (yield v) (control k (set! cont (lambda () (k (void)))) v))
(define (cont) (fun yield) finally)
(lambda () (prompt (cont))))
Used like this:
> (define i (iter (lambda (yield) (for-each yield '(1 2 3))) eof))
> (i)
1
> (i)
2
> (i)
3
> (i)
#<eof>
> (i)
#<eof>
and do-ized:
(define (in-yielder f)
(define end (list 1))
(define i (iter f end))
(make-do-sequence (lambda ()
(values (lambda (_) (i))
void void void
(lambda (e) (not (eq? end e)))
void))))
(for/list ([x (in-yielder (lambda (yield)
(for-each yield '(1 2 3))))])
x)
--
((lambda (x) (x x)) (lambda (x) (x x))) Eli Barzilay:
http://www.barzilay.org/ Maze is Life!