#lang racket (require racket/trace) ;;; Using call/cc to implement a return functionality. ;;; Since product-return is recursive, this does not ;;; buy us anything that we do not already have. (define product-return (lambda (ls) (call/cc (lambda (return) (cond [(null? ls) 1] [(zero? (car ls)) (return 0)] [else (* (car ls) (product-return (cdr ls) ))]))))) (trace product-return) ;;; Using call/cc to implement break functionality. ;;; This is more useful. (define product (lambda (ls) (call/cc (lambda (break) (product-break ls break))))) (trace product) (define product-break (lambda (ls break) (cond [(null? ls) 1] [(zero? (car ls)) (break 0)] [else (* (car ls) (product-break (cdr ls) break))]))) (trace product-break) ;;; This is realy nice code. (define product2 (lambda (ls) (call/cc (lambda (break) (letrec ([product-return (trace-lambda (ls) (cond [(null? ls) 1] [(zero? (car ls)) (break 0)] [else (* (car ls) (product-return (cdr ls)))]))]) (product-return ls))))))