resume/text/code_samples_compiler.org
2024-06-18 12:06:05 -05:00

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)))))