31 lines
718 B
Org Mode
Executable file
31 lines
718 B
Org Mode
Executable file
* 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
|
|
|