;;a7q4 ;; ;; ;; (define (compile expr) (local [(define (eval expr x-val) (cond [(cons? (first expr)) (eval (first expr) x-val)] [(number? (first expr)) (first expr)] [(symbol=? (first expr) 'x) x-val] [(symbol=? (first expr) '*) (local ((define (x expr) (cond [(empty? expr) 1] [(or (symbol? (first expr)) (cons? (first expr))) (* (eval expr x-val) (x (rest expr)))] [else (* (first expr) (x (rest expr)))]))) (x (rest expr)))] [(symbol=? (first expr) '/) (local ((define (x expr) (cond [(empty? expr) 1] [(or (symbol? (first expr)) (cons? (first expr))) (/ (eval expr x-val) (x (rest expr)))] [else (/ (first expr) (x (rest expr)))]))) (x (rest expr)))] [(symbol=? (first expr) '+) (local ((define (x expr) (cond [(empty? expr) 0] [(or (symbol? (first expr)) (cons? (first expr))) (+ (eval expr x-val) (x (rest expr)))] [else (+ (first expr) (x (rest expr)))]))) (x (rest expr)))] [(symbol=? (first expr) '-) (local ((define (x expr) (cond [(empty? expr) 0] [(or (symbol? (first expr)) (cons? (first expr))) (- (eval expr x-val) (x (rest expr)))] [else (- (first expr) (x (rest expr)))]))) (x (rest expr)))] [(symbol=? (first expr) 'pow) (local ((define (x expr) (cond [(empty? expr) 1] [(or (symbol? (first expr)) (cons? (first expr))) (expt (eval expr x-val) (x (rest expr)))] [else (expt (first expr) (x (rest expr)))]))) (x (rest expr)))]))] (lambda (x) (eval expr x)))) (compile '(+ 1 x))