(define (eval xval code) (cond [(number? code) code] [(symbol? code) xval] [(cons? code) (cond [(symbol=? (first code) '+) (+ (eval xval (second code)) (eval xval (third code)))] [(symbol=? (first code) '-) (- (eval xval (second code)) (eval xval (third code)))] [(symbol=? (first code) '*) (* (eval xval (second code)) (eval xval (third code)))] [(symbol=? (first code) '/) (/ (eval xval (second code)) (eval xval (third code)))] ) ] [else "Idiot programmer passed illegal code: must be number, symbol, or list."] ) ) ; evaluating a number (x ignored) (eval 1 5) ; => 5 ; evaluating x (eval 1 'x) ; => 1 ; evaluating a list (eval 1 '(+ x 5)) ; => 6 (eval 1 '(- x 1)) ; => 0 ; evaluating nested lists (eval 1 '(/ (+ x 3) 2)) ; => 2 ; evaluating complete nonsense (eval 0 #\a) ; => insulting error message