# 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))