(define-datatype continuation continuation? (rep-cont) (eval-cont (exps (list-of expression?)) (cont continuation?) (env scheme-value?)) (eval-bodies-cont (exps (list-of expression?)) (cont continuation?) (env scheme-value?)) (call/cc-cont (cont continuation?)) (cons-cont (value scheme-value?) (cont continuation?)) (proc-cont (cont continuation?)) (if-cont (true-exp expression?) (false-exp expression?) (next-cont continuation?) (env pair?))) (define apply-cont (lambda (cont val) (cases continuation cont [rep-cont () (pretty-print val) (rep)] [call/cc-cont (cont) (cases proc val [closure (ids bodies env) (eval-expressions bodies cont (extend-env ids (list (acontinuation cont)) env))] [else (eopl:error 'apply-cont "Continuation is not a procedure ~s" val)])] [eval-cont (exps cont env) (eval-expressions exps (cons-cont val cont) env)] [eval-bodies-cont (exps cont env) (eval-bodies exps cont env)] [proc-cont (cont) (if (proc? (caar val)) (apply-procedure (caar val) (cdr val) cont) (apply-procedure (car val) (cdr val) cont))] [cons-cont (value cont) (apply-cont cont (cons value val))] [if-cont (true-exp false-exp next-cont env) (if val (eval-expression true-exp next-cont env) (eval-expression false-exp next-cont env))])))