; Day 24 continutations examples. (define apply-continuation (lambda (k . v) (apply k v))) (define fact-acc (lambda (n acc) (if (zero? n) acc (fact-acc (- n 1) (* acc n))))) (define fact-cps (trace-lambda fact-cps (n k) (if (zero? n) (apply-continuation k 1) (fact-cps (- n 1) (lambda (v) (apply-continuation k (* n v))))))) (define list-copy-cps (lambda (L k) (if (null? L) (apply-continuation k '()) (list-copy-cps (cdr L) (lambda (v) (apply-continuation k (cons (car L) v))))))) (define memq-cps (lambda (sym ls k) (cond [(null? ls) (apply-continuation k #f)] [(eq? sym (car ls)) (apply-continuation k #t)] [else (memq-cps sym (cdr ls) k)]))) (define intersection ; convert this to CPS (lambda (los1 los2) (cond [(null? los1) '()] [(memq (car los1) los2) (cons (car los1) (intersection (cdr los1) los2))] [else (intersection (cdr los1) los2)]))) (define free-vars ; convert to CPS (lambda (exp) (cond [(symbol? exp) (list exp)] [(eq? (1st exp) 'lambda) (remove (car (2nd exp)) (free-vars (3rd exp)))] [else (union (free-vars (1st exp)) (free-vars (2nd exp)))]))) (define substitute-leftmost (lambda (new old slist) (subst-left-cps new old slist (lambda (v) v) ; succeed continuation (lambda () slist) ; fail continuation ))) (define subst-left-cps (lambda (new old slist changed unchanged) (let loop ([slist slist] [changed changed] [unchanged unchanged]) (cond [(null? slist) (unchanged)] .