#lang racket (require racket/trace) ;; This procedure has been warranted to work for top-level lists of integers. (define product (lambda (ls) (cond [(null? ls) 1] [(zero? (car ls)) 0] [else (* (car ls) (product (cdr ls)))]))) (trace product) (define productT (lambda (ls accu) (cond [(null? ls) accu] [(zero? (car ls)) 0] [else (productT (cdr ls) (* (car ls) accu))]))) (trace productT) (define product-cps (lambda (ls k) (cond [(null? ls) (k 1)] [(zero? (car ls)) 0] [else (product-cps (cdr ls) (lambda (x) (k (* x (car ls)))))]))) (trace product-cps) (define product-cps2 (lambda (ls k exit) (cond [(null? ls) (k 1)] [(zero? (car ls)) (exit 0)] [else (product-cps2 (cdr ls) (lambda (x) (k (* x (car ls)))) exit)]))) (trace product-cps2)