!(defrec ev (lambda (exp env) (if (atom exp) (env exp) (if (eq 'lambda (car exp)) (cons 'closure (cons exp (cons env '()))) (if (eq 'if (car exp)) (if (ev (car (cdr exp)) env) (ev (car (cdr (cdr exp))) env) (ev (car (cdr (cdr (cdr exp)))) env)) (if (eq '* (car exp)) (* (ev (car (cdr exp)) env) (ev (car (cdr (cdr exp))) env)) (if (eq '- (car exp)) (- (ev (car (cdr exp)) env) (ev (car (cdr (cdr exp))) env)) (if (eq 'eq (car exp)) (eq (ev (car (cdr exp)) env) (ev (car (cdr (cdr exp))) env)) (let ((fun (ev (car exp) env)) (arg (ev (car (cdr exp)) env)) (clo-exp (car (cdr fun))) (clo-env (car (cdr (cdr fun)))) (clo-param (car (car (cdr clo-exp)))) (clo-body (car (cdr (cdr clo-exp))))) (ev clo-body (lambda (x) (if (eq x clo-param) arg (clo-env x))))))))))))) !(def eval (lambda (exp) (ev exp (lambda (x) x))))