(load "chez-init.ss") (define fac (lambda (n) (if (= n 0) 1 (* n (fac (- n 1)))))) (define fac-cps-dt (lambda (n k) (if (= n 0) (apply-cont k 1) (fac-cps-dt (- n 1) (fac-cont n k))))) (define fac-cps-lambda (lambda (n k) (if (= n 0) (k 1) (fac-cps-lambda (- n 1) (lambda (hole) (k (* n hole))))))) (define-datatype continuation continuation? (halt-cont) (fac-cont (n number?) (next-cont continuation?)) (plus-cont (n number?) (next-cont continuation?)) (fib-cont (n number?) (next-cont continuation?))) (define apply-cont (lambda (cont val) (cases continuation cont [halt-cont () val] [plus-cont (n next-cont) (apply-cont next-cont (+ n val))] [fac-cont (n next-cont) (apply-cont next-cont (* n val))] [fib-cont (n next-cont) (fib-cps-dt n (plus-cont val next-cont))]))) (define fib (lambda (n) (cond [(= n 1) 1] [(= n 2) 1] [else (+ (fib (- n 1)) (fib (- n 2)))]))) (define fib-cps-dt (lambda (n k) (cond [(= n 1) (apply-cont k 1)] [(= n 2) (apply-cont k 1)] [else (fib-cps-dt (- n 1) (fib-cont (- n 2) k))]))) (define fib-cps-lambda (lambda (n k) (cond [(= n 1) (k 1)] [(= n 2) (k 1)] [else (fib-cps-lambda (- n 1) (lambda (hole1) (fib-cps-lambda (- n 2) (lambda (hole2) (k (+ hole1 hole2))))))])))