#lang racket (require racket/trace) ;;; Accumulating values (define facT-values (lambda (n accu) (if (= n 1) accu (facT-values (- n 1) (* n accu))))) (trace facT-values) ;;; Accumulating values through the detour of applications (define facT-apps (lambda (n accu) (if (= n 1) ((lambda () accu)) (facT-apps (- n 1) ((lambda (x) (* n x)) accu))))) (trace facT-apps) ;;; Accumulating lambda-exps (define facT-Lambda (lambda (n accu) (if (= n 1) (accu 1) (facT-Lambda (- n 1) (lambda (x) (accu (* n x))))))) (trace facT-Lambda) ;;; Sanitized version (define fac-cps (lambda (n k) (if (= n 1) (k 1) (fac-cps (- n 1) (lambda (x) (k (* n x)))))))