Back to slide -- Keyboard shortcut: 'u'  previous -- Keyboard shortcut: 'p'  next -- Keyboard shortcut: 'n'  Annotated program -- Keyboard shortcut: 't'    trampoline-applications-return-bounce.scm - Redefining bounce and return.Lecture 3 - slide 42 : 43
Program 3

(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>)