(define (return x) (tag 'done x)) (define (bounce thunk) (tag 'doing thunk)) (define (tag label thing) (cons label thing)) (define (fact-iter n acc) (if (zero? n) (return acc) (bounce (lambda () (fact-iter (- n 1) (* acc n)))))) (define (mem? n lst) (cond ((null? lst) (return #f)) ((= (car lst ) n) (return #t)) (else (bounce (lambda () (mem? n (cdr lst))))))) (define (fib n) (fib-iter n 0 0 1)) (define (fib-iter n i small large) (if (< i n) (bounce (lambda () (fib-iter n (+ i 1) large (+ large small)))) (return small))) ; > (fib 8) ; (doing . #) ; > (fact-iter 7 1) ; (doing . #) ; > (mem? 5 (list 1 2 3 4 5 6)) ; (doing . #)