#lang racket ; transform an infix expression tree E into an quoted s-expression that ; when eval'd evaulates to the value of the expression tree E. For example ; (exp-translate '( (1 + x) * (3 + (4 / 5)) )) is ; '(* (+ 1 x) (+ 3 (/ 4 5))) (define (exp-translate ex) (cond ; atoms are themselves [ (not (list? ex)) ex ] ; single element lists are the value of their first element, so ; drill down [ (null? (rest ex)) (exp-translate (first ex)) ] ; binary expressions just need to be rewritten in prefix form [ else (list (second ex) (exp-translate (first ex)) (exp-translate (third ex))) ] )) (define (etest E) (let [ (T (exp-translate E) ) ] (fprintf (current-output-port) ;"~a => ~s evals to " "(exp-translate ~v) is ~v\n" E T) ;(displayln (eval T)) )) (define (testseq) ;(etest '1) ;(etest '(1)) (etest '(1 + 2)) (etest '(3 * 4)) (etest '( (1 + 2) * (3 + 4) )) ; these next one should fail unless x is defined (define x 42) (etest 'x) (etest '(1 + x)) ) (testseq)