ludus/janet/ludus.janet
2024-06-06 16:14:04 -04:00

56 lines
1.5 KiB
Plaintext

# an integrated Ludus interpreter
# devised in order to run under wasm
# takes a string, returns a string with a json object
(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 /prelude :as prelude)
(import spork/json :as j)
(defn run [source]
(when (= :error prelude/pkg) (error "could not load prelude"))
(def ctx @{:^parent prelude/ctx})
(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))
(set (out :errors) (scanned :errors))
(each err (scanned :errors)
(e/scan-error err))
(break out))
(def parsed (p/parse scanned))
(when (any? (parsed :errors))
(set (out :errors) (parsed :errors))
(each err (parsed :errors)
(e/parse-error err))
(break out))
(def validated (v/valid parsed ctx))
(when (any? (validated :errors))
(set (out :errors) (validated :errors))
(each err (validated :errors)
(e/validation-error err))
(break out))
(setdyn :out console)
(try
(set result (i/interpret (parsed :ast) ctx))
([err]
(e/runtime-error err)
(set (out :errors) [err])
(break out)))
(setdyn :out stdout)
(set (out :result) result)
(var post @{})
(try
(set post (i/interpret prelude/post/ast ctx))
([err] (e/runtime-error err)))
(set (out :draw) (post :draw))
(j/encode out))