[plt-scheme] Re: yield-oriented sequence constructor
On Fri, Mar 21, 2008 at 5:47 PM, Doug Orleans <dougorleans at gmail.com> wrote:
> (define (make-yield-sequence thunk)
> (make-do-sequence
> (lambda ()
> (let ((done (gensym)))
> (values
> (lambda (pos) (apply values (cdr pos)))
> (lambda (pos) (call/cc (car pos)))
> (let/cc return
> (parameterize ((current-yield-proc
> (let loop ((return return))
> (lambda vals
> (current-yield-proc
> (loop
> (let/cc continue
> (return (cons continue vals)))))))))
> (thunk)
> (yield done)))
> (lambda (pos) (or (null? (cdr pos)) (not (eq? (cadr pos) done))))
> void
> void)))))
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?
(require scheme/control)
(define (make-yield-sequence thunk)
(define (yield . vals) (control k (cons k vals)))
(make-do-sequence
(lambda ()
(values
(lambda (pos) (apply values (cdr pos)))
(lambda (pos) (prompt ((car pos))))
(prompt
(parameterize ((current-yield-proc yield))
(thunk))
(control k #f))
values
void
void))))
--dougorleans at gmail.com