ludus/janet/ludus.janet
2024-06-05 17:47:41 -04:00

87 lines
2.3 KiB
Plaintext

# an integrated Ludus interpreter
(try (os/cd "janet") ([_] nil)) # for REPL
(import /scanner :as s)
(import /parser :as p)
(import /validate :as v)
(import /interpreter :as i)
(import /errors :as e)
(import /base :as b)
(import spork/json :as j)
(comment
The API from the old Clojure Ludus interpreter returns an object with four fields:
* `console`: an array of lines to be printed to the console
* `result`: a string representation of the result of running the script
* `draw`: an array of arrays that represent p5 calls, e.g. `["line", 0, 0, 100, 100]`
* `errors`: an array of errors, which are just strings
This new scene will have to return a JSON POJSO:
{:console "..." :result "..." :draw [...] :errors [...]}
)
(def prelude-ctx @{:^parent {"base" b/base}})
# (comment
# (do
(def prelude-ctx @{:^parent {"base" b/base}})
(def prelude-src (slurp "prelude.ld"))
(def prelude-scanned (s/scan prelude-src))
(def prelude-parsed (p/parse prelude-scanned))
(def parse-errors (prelude-parsed :errors))
(when (any? parse-errors) (each err parse-errors (e/parse-error err)))
(def prelude-validated (v/valid prelude-parsed prelude-ctx))
(def validation-errors (prelude-validated :errors))
(when (any? validation-errors) (each err validation-errors (e/validation-error err)))
(def prelude-pkg (try
(i/interpret (prelude-parsed :ast) prelude-ctx)
([e] e)))
(keys prelude-pkg)
(prelude-pkg :msg)
(e/runtime-error prelude-pkg)
# )
(defn run [source]
(def errors @[])
(def draw @[])
(var result @"")
(def console @"")
(def out @{:errors errors :draw draw :result result :console console})
(def scanned (s/scan source))
(when (any? (scanned :errors))
(break (do
(each err (scanned :errors)
(e/scan-error err)))))
(def parsed (p/parse scanned))
(when (any? (parsed :errors))
(break (each err (parsed :errors)
(e/parse-error err))))
(def validated (v/valid parsed prelude-ctx))
(when (any? (validated :errors))
(break (each err (validated :errors)
(e/validation-error err))))
(setdyn :out console)
(try
(set result (b/show (i/interpret (parsed :ast) prelude-ctx)))
([err] (setdyn :out stdout) (e/runtime-error err)))
(setdyn :out stdout)
(set (out :result) result)
(j/encode out))
(defn test [source])
(defn run-script [filename]
(def source (slurp filename))
(run source))
(def source `
let pi = base :pi
pi
`)
b/base
(-> source run j/decode)