Hi there!

I wrote a blog post called The Most Important Idea in Computer Science. In it, I challenged the reader to write a small Lisp interpreter in a TDD fashion.

I promised to give a solution, so here is mine. Please feel free to share your solution!

```
(defn my-eval [env exp]
(cond
(nil? exp) nil
(number? exp) exp
(string? exp) exp
(symbol? exp) (get env exp)
(fn? exp) exp
(list? exp)
(let [[op & args] exp]
(cond
(= 'if op)
(let [[test then else] args]
(if (nil? (my-eval env test))
(my-eval env else)
(my-eval env then)))
(= 'do op)
(when-not (empty? args)
(loop [[f & rst] args]
(if (empty? rst)
(my-eval env f)
(do
(my-eval env f)
(recur rst)))))
(= 'let op)
(let [[[var val] & body] args]
(my-eval (assoc env var val) (cons 'do body)))
:else
(apply (my-eval env op) (map #(my-eval env %) args))))))
```

Rock on!

Eric