First pass at new state model: all refs are included in results.

This commit is contained in:
Scott Richmond 2023-12-27 12:24:12 -05:00
parent f657da57ef
commit 14780bf6b8
3 changed files with 10 additions and 3 deletions

View File

@ -85,18 +85,23 @@
(println (stringify-args args)) (println (stringify-args args))
:ok)}) :ok)})
(def refs (atom {})) ;; atom not volatile!, maybe we'll be multithreaded someday
(def deref- {:name "deref" (def deref- {:name "deref"
::data/type ::data/clj ::data/type ::data/clj
:body (fn [ref] :body (fn [ref]
(if (::data/ref ref) (if (::data/ref ref)
(deref (::data/value ref)) (get @refs (::data/name ref))
(throw (ex-info "Cannot deref something that is not a ref" {}))))}) (throw (ex-info "Cannot deref something that is not a ref" {}))))})
(def set!- {:name "set!" (def set!- {:name "set!"
::data/type ::data/clj ::data/type ::data/clj
:body (fn [ref value] :body (fn [ref value]
(if (::data/ref ref) (if (::data/ref ref)
(reset! (::data/value ref) value) (do
(swap! refs assoc (::data/name ref) value)
(reset! (::data/value ref) value)
value)
(throw (ex-info "Cannot set! something that is not a ref" {}))))}) (throw (ex-info "Cannot set! something that is not a ref" {}))))})
(def show {:name "show" (def show {:name "show"

View File

@ -673,6 +673,7 @@
(let [value (interpret-ast expr ctx) (let [value (interpret-ast expr ctx)
box (atom value) box (atom value)
ref {::data/ref true ::data/value box ::data/name name}] ref {::data/ref true ::data/value box ::data/name name}]
(swap! base/refs assoc name value)
(vswap! ctx update-ctx {name ref}) (vswap! ctx update-ctx {name ref})
ref))) ref)))

View File

@ -39,11 +39,12 @@
user_result (i/interpret-safe source user_parsed {} testing?) user_result (i/interpret-safe source user_parsed {} testing?)
result_str (show/show user_result) result_str (show/show user_result)
test_results @i/test-results test_results @i/test-results
state @base/refs
post_scanned (s/scan pre/postlude "postlude") post_scanned (s/scan pre/postlude "postlude")
post_tokens (:tokens post_scanned) post_tokens (:tokens post_scanned)
post_parsed (p/apply-parser g/script post_tokens) post_parsed (p/apply-parser g/script post_tokens)
post_result (i/interpret-safe source post_parsed {} false) 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 state)
clj_result (ld->clj ludus_result) clj_result (ld->clj ludus_result)
] ]
(cond (cond