2024-06-05 15:55:06 +00:00
|
|
|
# an integrated Ludus interpreter
|
2024-06-06 20:14:04 +00:00
|
|
|
# devised in order to run under wasm
|
|
|
|
# takes a string, returns a string with a json object
|
2024-06-06 22:47:04 +00:00
|
|
|
# (try (os/cd "janet") ([_] nil)) # for REPL
|
|
|
|
(import /src/scanner :as s)
|
|
|
|
(import /src/parser :as p)
|
|
|
|
(import /src/validate :as v)
|
|
|
|
(import /src/interpreter :as i)
|
|
|
|
(import /src/errors :as e)
|
|
|
|
(import /src/base :as b)
|
|
|
|
(import /src/prelude :as prelude)
|
2024-06-07 17:42:11 +00:00
|
|
|
(import /src/json :as j)
|
2024-06-05 17:01:43 +00:00
|
|
|
|
2024-06-06 22:47:04 +00:00
|
|
|
(defn ludus [source]
|
2024-06-06 19:41:33 +00:00
|
|
|
(when (= :error prelude/pkg) (error "could not load prelude"))
|
2024-06-06 00:16:29 +00:00
|
|
|
(def ctx @{:^parent prelude/ctx})
|
2024-06-05 17:01:43 +00:00
|
|
|
(def errors @[])
|
|
|
|
(def draw @[])
|
|
|
|
(var result @"")
|
|
|
|
(def console @"")
|
2024-06-14 18:53:23 +00:00
|
|
|
(setdyn :out console)
|
2024-06-05 17:01:43 +00:00
|
|
|
(def out @{:errors errors :draw draw :result result :console console})
|
2024-06-05 15:55:06 +00:00
|
|
|
(def scanned (s/scan source))
|
|
|
|
(when (any? (scanned :errors))
|
2024-06-05 21:47:41 +00:00
|
|
|
(each err (scanned :errors)
|
2024-06-06 20:14:04 +00:00
|
|
|
(e/scan-error err))
|
2024-06-07 20:41:11 +00:00
|
|
|
(break (-> out j/encode string)))
|
2024-06-05 15:55:06 +00:00
|
|
|
(def parsed (p/parse scanned))
|
|
|
|
(when (any? (parsed :errors))
|
2024-06-06 20:14:04 +00:00
|
|
|
(each err (parsed :errors)
|
|
|
|
(e/parse-error err))
|
2024-06-07 20:41:11 +00:00
|
|
|
(break (-> out j/encode string)))
|
2024-06-06 00:16:29 +00:00
|
|
|
(def validated (v/valid parsed ctx))
|
2024-06-05 15:55:06 +00:00
|
|
|
(when (any? (validated :errors))
|
2024-06-06 20:14:04 +00:00
|
|
|
(each err (validated :errors)
|
|
|
|
(e/validation-error err))
|
2024-06-10 22:26:48 +00:00
|
|
|
(break (-> out j/encode string)))
|
2024-06-05 15:55:06 +00:00
|
|
|
(try
|
2024-06-06 19:41:33 +00:00
|
|
|
(set result (i/interpret (parsed :ast) ctx))
|
2024-06-06 20:14:04 +00:00
|
|
|
([err]
|
|
|
|
(e/runtime-error err)
|
2024-06-07 20:41:11 +00:00
|
|
|
(break (-> out j/encode string))))
|
2024-06-06 20:14:04 +00:00
|
|
|
(setdyn :out stdout)
|
2024-06-06 22:47:04 +00:00
|
|
|
(set (out :result) (b/show result))
|
2024-06-06 20:14:04 +00:00
|
|
|
(var post @{})
|
|
|
|
(try
|
|
|
|
(set post (i/interpret prelude/post/ast ctx))
|
|
|
|
([err] (e/runtime-error err)))
|
|
|
|
(set (out :draw) (post :draw))
|
2024-06-07 20:41:11 +00:00
|
|
|
(-> out j/encode string))
|
|
|
|
|
2024-06-16 01:53:40 +00:00
|
|
|
(comment
|
|
|
|
# (do
|
2024-06-14 18:53:23 +00:00
|
|
|
(def source `
|
2024-06-17 17:29:08 +00:00
|
|
|
words ("foo bar ba,;;;!!!z")
|
2024-06-14 18:53:23 +00:00
|
|
|
`)
|
2024-06-10 22:26:48 +00:00
|
|
|
(def out (-> source
|
2024-06-14 21:17:23 +00:00
|
|
|
ludus
|
2024-06-14 18:53:23 +00:00
|
|
|
j/decode
|
|
|
|
))
|
|
|
|
(setdyn :out stdout)
|
2024-06-10 22:26:48 +00:00
|
|
|
(def console (out "console"))
|
|
|
|
(print console)
|
|
|
|
(def result (out "result"))
|
|
|
|
(print result)
|
|
|
|
)
|
|
|
|
|