(let ((ret #f) (toggle-a #t) (toggle-b #f) (save-point #f) (vals '(a b c d e f)) (refs '(1 0 3 1 4 4 5))) (let ((generator (call/cc (lambda (yield) (let ((a (lambda (cc) (let loop () (set! ret (list-ref vals (car refs))) (set! refs (cdr refs)) (call/cc (lambda (k) (set! save-point k))) (cond ((eq? toggle-a #t) (set! toggle-a #f) (set! toggle-b #t) (yield ret)) ((eq? toggle-b #t) (set! cc (call/cc cc)) (loop)))))) (b (lambda (cc) (let loop () (set! ret (list-ref vals (car refs))) (set! refs (cdr refs)) (call/cc (lambda (k) (set! save-point k))) (cond ((eq? toggle-b #t) (set! toggle-b #f) (set! toggle-b #t) (yield ret)) ((eq? toggle-b #t) (set! cc (call/cc cc)) (loop)))))) (if (eq? save-point #f) (a b) (save-point '())))))))) (generator))) ;should output badbeef if generator called appropriate number of times