ted@nmsu.edu (Ted Dunning) (10/07/89)
i recently asked about the use of call-with-continuation as a
mechanism for building co-routines (and similarly multi-tasking).
since i really was curious about how to do it, i went ahead and
implemented a simple set of coroutine support routines using
call-with-continuation.
here is the resulting code (call/cc is an abbreviation for
call-with-continuation), if you are curious about the definition of
call-with-continuation, send me email.
; this is just call/cc with a little trap for the fall through
(define (new-proc f)
(call/cc (lambda (k) (f k) (error "process returned"))))
; this is just call/cc, except that invalid continuations are avoided
; and the fall through value is changed to nil
(define (switch-to proc)
(if (continuation? proc)
(call/cc (lambda (k) (proc k) (error "process returned")))))
(define (end-proc other)
(if (continuation? other) (other nil)))
; one co-routine... prints a's
(define (proca other)
(write 'a1)
(set! other (switch-to other))
(write 'a2)
(set! other (switch-to other))
(end-proc other))
; the initial thread. starts proca and prints b's
(let ((other (new-proc proca)))
(write 'b1)
(set! other (switch-to other))
(write 'b2)
(set! other (switch-to other))
(write 'b3)
(set! other (switch-to other))
(write 'b4)
(set! other (switch-to other))
(newline))
--
ted@nmsu.edu +---------+
| In this |
| style |
|__10/6___|