From 3a8a236f01864983676fda00dbd755f3a9926b7c Mon Sep 17 00:00:00 2001 From: Scott Richmond Date: Tue, 14 May 2024 20:44:54 -0400 Subject: [PATCH] start work on interpreter --- janet/base.janet | 0 janet/interpreter.janet | 54 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 janet/base.janet create mode 100644 janet/interpreter.janet diff --git a/janet/base.janet b/janet/base.janet new file mode 100644 index 0000000..e69de29 diff --git a/janet/interpreter.janet b/janet/interpreter.janet new file mode 100644 index 0000000..6468a36 --- /dev/null +++ b/janet/interpreter.janet @@ -0,0 +1,54 @@ +# A tree walk interpreter for ludus + +(var interpret nil) + +(defn- iff [ast ctx] + (def [condition then else] (ast :data)) + (if (interpret condition ctx) + (interpret then ctx) + (interpret else ctx))) + +(defn- script [ast ctx] + (print "interpreting script") + (def lines (ast :data)) + (var result nil) + (each line lines + (print "interpreting script line") + (set result (interpret line ctx))) + result) + +(defn- interpret* [ast ctx] + (print "interpreting ast node " (ast :type)) + (case (ast :type) + :nil nil + :number (ast :data) + :bool (ast :data) + :string (ast :data) + :keyword (ast :data) + :if (iff ast ctx) + :script (script ast ctx))) + +(set interpret interpret*) + +# repl +(try (os/cd "janet") ([_] nil)) +(import ./scanner :as s) +(import ./parser :as p) +(import ./validate :as v) + +(var source nil) + +(defn run [] + (def scanned (s/scan source)) + (def parsed (p/parse scanned)) + (def validated (v/valid parsed)) + (pp parsed) + (interpret (parsed :ast) @{})) + + +(do +(set source ` +if false then :bar else :baz +`) +(run) +)