#lang racket (require racket/fixnum) (provide explicate-control) (define (explicate-control sexp) (match sexp [`(program ,info ,exp) `(program ,info ((start . ,(explicate-control-tail exp))))])) ; after a remove-complex-opera*, all expressions ; are compatible with C0 (define (explicate-control-tail exp) (match exp [(? fixnum?) `(return ,exp)] [(? symbol?) `(return ,exp)] [`(read) `(return ,exp)] [`(- ,e) `(return ,exp)] [`(+ ,e1 ,e2) `(return ,exp)] [`(let ([,var ,rexp]) ,body) (explicate-control-assign var rexp (explicate-control-tail body))])) ; stmt := (assign var exp) ; tail := (return exp) / (seq stmt tail) (define (explicate-control-assign var exp c0-body) `() (match exp [`(let ([,v ,x]) ,b) (explicate-control-assign v x (explicate-control-assign var b c0-body))] [_ `(seq (assign ,var ,exp) ,c0-body)]))