From 74f1d02a2f16da9e2ce2fb747dad07979a9db26a Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Sat, 29 Nov 2014 02:29:56 -0400 Subject: + Added simple let expressions. (No destructuring of tuples/records yet) + Added records and simple operations on them (get, set & remove). --- src/lang/interpreter.clj | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) (limited to 'src/lang/interpreter.clj') diff --git a/src/lang/interpreter.clj b/src/lang/interpreter.clj index 73148831e..85be602da 100644 --- a/src/lang/interpreter.clj +++ b/src/lang/interpreter.clj @@ -18,6 +18,8 @@ (def <=' (fn [x] (fn [y] (<= x y)))) (def -' (fn [x] (fn [y] (- x y)))) +(def +' (fn [x] (fn [y] (+ x y)))) +(def *' (fn [x] (fn [y] (* x y)))) ;; [Utils] (def ^:private +state+ @@ -64,7 +66,7 @@ output#) _# (do ;; (println "Unknown syntax: " (pr-str ~'*token*)) - (fail* (str "Unknown syntax: " (pr-str ~'*token*))))))))) + (fail* (str "Unknown syntax: " (pr-str ~'*token*))))))))) (defeval eval-ident [::&parser/ident ?ident] @@ -103,6 +105,23 @@ ] (return nil))) +(defeval eval-get + [::&parser/get ?tag [::&parser/ident ?record]] + (exec [=record (resolve ?record)] + (return (get =record ?tag)))) + +(defeval eval-set + [::&parser/set ?tag ?value [::&parser/ident ?record]] + (exec [state &util/get-state + =value (apply-m eval-form (wrap-in state ?value)) + =record (resolve ?record)] + (return (assoc =record ?tag =value)))) + +(defeval eval-remove + [::&parser/remove ?tag [::&parser/ident ?record]] + (exec [=record (resolve ?record)] + (return (dissoc =record ?tag)))) + (defeval eval-fn-call [::&parser/fn-call ?fn ?args] (exec [state &util/get-state @@ -120,6 +139,9 @@ eval-ident eval-def eval-defdata + eval-get + eval-set + eval-remove eval-fn-call])) (defn eval [text] @@ -150,4 +172,9 @@ ;; (fold * 1 (repeat exp base))) ;; Syntax for chars: #"a" + + + ;; (set@ {#z 30} bar) (set@ {#z 30 #w "YOLO"} bar) + ;; (remove@ [#x #y] bar) + ;; (get@ [#x #y] bar) ) -- cgit v1.2.3