meval = {|meval env exp| lookup = {|lookup key env| (if (eq env nil) key (if (eq (hd (hd env)) key) (tl (hd env)) (lookup lookup key (tl env)) ))} values = {|values env exps| (if (atom exps) (lookup exps env) (pair (meval meval env (hd exps)) (values values env (tl exps))))} extend = {|extend params values env| (if (eq params nil) env (if (atom params) (lookup exps env) (pair (pair (hd params) (hd values)) (extend extend (tl params) (tl values) env))))} (if (atom exp) (lookup lookup exp env) (action = (meval meval env (hd exp)) (if (atom action) (if (eq (hd exp) 'quote) (hd (tl exp)) (if (eq (hd exp) 'atom) (atom (meval meval env (hd (tl exp)))) (if (eq (hd exp) 'eq) (eq (meval meval env (hd (tl exp))) (meval meval env (hd (tl (tl exp))))) (if (eq (hd exp) 'pair) (pair (meval meval env (hd (tl exp))) (meval meval env (hd (tl (tl exp))))) (if (eq (hd exp) 'hd) (hd (meval meval env (hd (tl exp)))) (if (eq (hd exp) 'tl) (tl (meval meval env (hd (tl exp)))) (if (eq (hd exp) 'if) (if (meval meval env (hd (tl exp))) (meval meval env (hd (tl (tl exp)))) (meval meval env (hd (tl (tl (tl exp)))))) (if (eq (hd exp) 'fn) (pair '__closure (pair env (tl exp))) nil)))))))) (if (eq (hd action) '__closure__) (lex-env = (hd (tl action)) params = (hd (tl (tl action))) fn-body = (hd (tl (tl (tl action)))) (meval meval (extend extend params (values values env (tl exp)) lex-env) fn-body)) nil))))}