* The Metacircular Interpretter in Clojure #+BEGIN_SRC clojure (ns interpreter.core (:gen-class)) (require '[farg.pmatch :refer [pmatch]]) (def base-env (fn [x] (pmatch x inc inc dec dec x 1))) (def eval-expr (fn [expr env] (pmatch expr ~x (guard (number? x)) x ~x (guard (symbol? x)) (env x) (lambda (~arg) ~body) (fn [x] (eval-expr body (fn [sym] (if (= sym arg) x (env sym))))) (~rator ~rand) ((eval-expr rator env) (eval-expr rand env))))) #+END_SRC