(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 . #<procedure:STDIN::11935>)
; > (fact-iter 7 1)
; (doing . #<procedure:STDIN::11560>)
; > (mem? 5 (list 1 2 3 4 5 6))
; (doing . #<procedure:STDIN::11771>) | | x is tagged with the symbol done
thunk is tagged with symbol doing. Notice: thunk is NOT called!
The tagging function
|