718 B
Executable file
718 B
Executable file
The Metacircular Interpretter in 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)))))