(define *-counter-maker (lambda () (let ((c 0)) (lambda (msg . args) (case msg ((type) '*-counter) ((show) c) (else (set! c (+ c 1)) (* msg (car args)))))))) (define (product-cps ls *-counter) (define (loop ls k) (cond ((null? ls) (k 1)) ((zero? (car ls)) 0) (else (loop (cdr ls) (lambda (x) (*-counter (car ls) (k x))))))) (loop ls (lambda (x) x))) (define (fact x) (define (loop x acc) (if (= x 0) acc (loop (- x 1) (* x acc)))) (loop x 1)) (define (fact-cps x) (define (loop x k) (if (= x 0) (k 1) (loop (- x 1) (lambda (acc) (* x (k acc)))))) (loop x (lambda (x) x))) (define (fib x) (if (<= x 1) x (+ (fib (- x 1)) (fib (- x 2))))) (define (fib-cps x) (define (loop x k) (if (<= x 1) (k x) (loop (- x 1) (lambda (y) (loop (- x 2) (lambda (z) (+ y (k z)))))))) (loop x (lambda (x) x))) (define (fib-tail x) (define (loop x acc0 acc1) (if (= x 0) acc0 (loop (- x 1) acc1 (+ acc0 acc1)))) (loop x 0 1)) (define (fib-tail-cps x) (define (loop x k) (if (= x 0) (k 0 1) (loop (- x 1) (lambda (acc0 acc1) (k acc1 (+ acc0 acc1)))))) (loop x (lambda (acc0 acc1) acc0)))