(define-syntax let/cc (syntax-rules () ((_ ?var ?body) (call-with-current-continuation (lambda (?var) ?body))))) (define resume #f) (define (error) (/ 1 0)) (define (makecoroutine body) (let ((lcs #f)) (letrec ((newcoroutine (lambda (value) (lcs value))) (localresume (lambda (cont value) (let ((received-value (let/cc localcont (begin (set! lcs localcont) (cont value))))) (set! resume localresume) received-value )))) (let/cc exit (begin (body (localresume exit newcoroutine)) (error)))))) (define (example) (let/cc returncont (let ((co1 #f) (co2 #f)) (set! co1 (makecoroutine (lambda (initval1) (write "1 ") (write initval1) (set! initval1 (resume co2 (+ initval1 1))) (write "1 ") (write initval1) (set! initval1 (resume co2 (+ initval1 1))) (returncont initval1) ))) (set! co2 (makecoroutine (lambda (initval2) (write "2 ") (write initval2) (set! initval2 (resume co1 (+ initval2 1))) (write "2 ") (resume co1 (+ initval2 1)) ))) (co1 33) )))