#lang racket (provide uncover-locals) (define (uncover-locals p) (match p [`(program ,data ,c0-blocks) `(program ,(append data (cons `locals (uncover-locals-blocks c0-blocks))) c0-blocks)])) (define (uncover-locals-blocks c0-blocks) (if (empty? c0-blocks) `() (append (uncover-locals-block (car c0-blocks)) (uncover-locals-blocks (cdr c0-blocks))))) (define (uncover-locals-block c0-block) (match c0-block [`(,label . ,tail) (uncover-locals-tail tail)])) (define (uncover-locals-tail c0-tail) (match c0-tail [`(return ,exp) `()] [`(seq (assign ,var ,exp) ,next) (cons var (uncover-locals-tail next))]))