(define-datatype continuation continuation? (label-cont (num number?) (cont continuation?)) (rep-cont) (halt-cont) (break-cont (cont continuation?)) (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?)) (change-cont (sym symbol?) (env scheme-value?) (cont continuation?)) (define-cont (sym symbol?) (env scheme-value?) (cont continuation?)) (proc-cont (cont continuation?)) (let-cont (syms (list-of symbol?)) (bodies (list-of expression?)) (env scheme-value?) (cont continuation?)) (if-cont (true-exp expression?) (false-exp expression?) (cont continuation?) (env pair?))) (define apply-cont (lambda (cont val) (cases continuation cont [label-cont (num cont) (apply-cont cont val)] [halt-cont () val] [rep-cont () (pretty-print val) (rep)] [break-cont (cont) (unwind-continuations cont val)] [change-cont (sym env cont) (apply-cont cont (change-env env sym val))] [define-cont (sym env cont) (apply-cont cont (define-env env sym val))] [let-cont (syms bodies env cont) (eval-bodies bodies cont (extend-env syms val env))] [call/cc-cont (cont) (cases proc val [closure (ids bodies env) (eval-bodies 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 cont env) (if val (eval-expression true-exp cont env) (eval-expression false-exp cont env))]))) (define unwind-continuations (lambda (cont val) (cases continuation cont [halt-cont () val] [rep-cont () (pretty-print val) (rep)] [break-cont (cont) (unwind-continuations cont val)] [change-cont (sym env cont) (unwind-continuations cont val)] [define-cont (sym env cont) (unwind-continuations cont val)] [let-cont (syms bodies env cont) (unwind-continuations cont val)] [call/cc-cont (cont) (unwind-continuations cont val)] [eval-cont (exps cont env) (unwind-continuations cont val)] [eval-bodies-cont (exps cont env) (unwind-continuations cont val)] [proc-cont (cont) (unwind-continuations cont val)] [cons-cont (value cont) (unwind-continuations cont val)] [if-cont (true-exp false-exp cont env) (unwind-continuations cont val)])))