diff options
Diffstat (limited to 'clojure/src/lccl/lc')
| -rw-r--r-- | clojure/src/lccl/lc/ast.clj | 7 | ||||
| -rw-r--r-- | clojure/src/lccl/lc/evaluator.clj | 28 |
2 files changed, 0 insertions, 35 deletions
diff --git a/clojure/src/lccl/lc/ast.clj b/clojure/src/lccl/lc/ast.clj deleted file mode 100644 index 58bad11..0000000 --- a/clojure/src/lccl/lc/ast.clj +++ /dev/null @@ -1,7 +0,0 @@ -(ns lccl.lc.ast) - -(defrecord Var [name]) -(defrecord Abs [arg body]) -(defrecord App [left right]) - -(def IDENTITY (->Abs "x" (->Var "x"))) diff --git a/clojure/src/lccl/lc/evaluator.clj b/clojure/src/lccl/lc/evaluator.clj deleted file mode 100644 index 70e972e..0000000 --- a/clojure/src/lccl/lc/evaluator.clj +++ /dev/null @@ -1,28 +0,0 @@ -(ns lccl.lc.evaluator - (:import [lccl.lc.ast Var Abs App]) - (:require [lccl.lc.ast :refer [->Abs ->App]])) - -(declare substitute) - -(defmulti evaluate (fn [term] [(type term)])) -(defmethod evaluate [Var] ([term] term)) -(defmethod evaluate [Abs] ([term] term)) -(defmethod evaluate [App] - ([term] - (let [left (-> term :left)] - (condp = (type left) - Abs (substitute (:body left) (:arg left) (:right term)) - term)))) - -(defmulti substitute (fn [body arg val] [(type body)])) -(defmethod substitute [Var] - ([body arg val] - (if (= (:name body) arg) val body))) -(defmethod substitute [Abs] - ([body arg val] - (if (= (:arg body) arg) - body - (->Abs (:arg body) (substitute (:body body) arg val))))) -(defmethod substitute [App] - ([body arg val] - (->App (substitute (:left body) arg val) (substitute (:right body) arg val)))) |
