From c2943e0ba7903f5392796b4b4b8dc7d88ab65c94 Mon Sep 17 00:00:00 2001 From: Scott Richmond Date: Sat, 20 Jan 2024 18:42:12 -0500 Subject: [PATCH] Draft changes. --- src/ludus/base.cljc | 2 +- src/ludus/interpreter.cljc | 9 +++++++-- src/ludus/node.cljc | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/ludus/base.cljc b/src/ludus/base.cljc index dbe7021..edad682 100644 --- a/src/ludus/base.cljc +++ b/src/ludus/base.cljc @@ -426,4 +426,4 @@ :floor floor :round round :range range- - }) \ No newline at end of file + }) diff --git a/src/ludus/interpreter.cljc b/src/ludus/interpreter.cljc index bac3602..f474675 100644 --- a/src/ludus/interpreter.cljc +++ b/src/ludus/interpreter.cljc @@ -664,16 +664,21 @@ ) )) +(def state (atom {})) ;; for now use a global state atom + (defn- interpret-ref [ast ctx] (let [data (:data ast) name (-> data first :data first) expr (-> data second)] (when (contains? @ctx name) (throw (ex-info (str "Name " name " is already bound") {:ast ast}))) + (when (contains? @state name) + (throw (ex-info (str "A ref already has " name " name") {:ast ast}))) (let [value (interpret-ast expr ctx) box (atom value) - ref {::data/ref true ::data/value box ::data/name name}] + ref {::data/ref true ::data/value box ::data/name name ::data/state state}] (vswap! ctx update-ctx {name ref}) + (swap! state assoc name ref) ref))) (defn- interpret-loop [ast ctx] @@ -1068,4 +1073,4 @@ (println result) result - ) \ No newline at end of file + ) diff --git a/src/ludus/node.cljc b/src/ludus/node.cljc index af70a1c..ebd7e99 100644 --- a/src/ludus/node.cljc +++ b/src/ludus/node.cljc @@ -43,7 +43,7 @@ post_tokens (:tokens post_scanned) post_parsed (p/apply-parser g/script post_tokens) post_result (i/interpret-safe source post_parsed {} false) - ludus_result (assoc post_result :result result_str :test test_results) + ludus_result (assoc post_result :result result_str :test test_results :state @i/state) clj_result (ld->clj ludus_result) ] (cond