Basically wire the things up!
This commit is contained in:
parent
17592149f1
commit
c9ccffa067
|
@ -1 +1,2 @@
|
||||||
(ns ludus.data)
|
(ns ludus.data)
|
||||||
|
|
||||||
|
|
|
@ -895,7 +895,7 @@
|
||||||
interpreted (interpret-ast parsed base-ctx)
|
interpreted (interpret-ast parsed base-ctx)
|
||||||
namespace (dissoc interpreted ::data/type ::data/name ::data/struct)
|
namespace (dissoc interpreted ::data/type ::data/name ::data/struct)
|
||||||
context (ns->ctx namespace)]
|
context (ns->ctx namespace)]
|
||||||
;(println context)
|
(println "Prelude fully loaded.")
|
||||||
context))
|
context))
|
||||||
|
|
||||||
; ;; TODO: update this to use new parser pipeline & new AST representation
|
; ;; TODO: update this to use new parser pipeline & new AST representation
|
||||||
|
@ -939,17 +939,18 @@
|
||||||
{:result :error :ctx (volatile! orig-ctx)})))))
|
{:result :error :ctx (volatile! orig-ctx)})))))
|
||||||
|
|
||||||
(defn interpret-safe [source parsed ctx]
|
(defn interpret-safe [source parsed ctx]
|
||||||
(try
|
(let [base-ctx (volatile! {::parent (volatile! (merge ludus-prelude ctx))})]
|
||||||
(let [base-ctx (volatile! {::parent (volatile! (merge ludus-prelude ctx))})]
|
(try
|
||||||
(interpret-ast parsed base-ctx))
|
(println "Running source: " source)
|
||||||
(catch #?(:clj Throwable :cljs js/Object) e
|
(interpret-ast parsed base-ctx)
|
||||||
(println "Ludus panicked!")
|
(catch #?(:clj Throwable :cljs js/Object) e
|
||||||
(println "On line" (get-in (ex-data e) [:ast :token :line]))
|
(println "Ludus panicked!")
|
||||||
(println ">>> " (get-line source (get-in (ex-data e) [:ast :token :line])))
|
(println "On line" (get-in (ex-data e) [:ast :token :line]))
|
||||||
(println (ex-message e))
|
(println ">>> " (get-line source (get-in (ex-data e) [:ast :token :line])))
|
||||||
(pp/pprint (ex-data e))
|
(println (ex-message e))
|
||||||
(throw e)
|
(pp/pprint (ex-data e))
|
||||||
)))
|
(throw e)
|
||||||
|
))))
|
||||||
|
|
||||||
;; repl
|
;; repl
|
||||||
(comment
|
(comment
|
||||||
|
|
42
src/ludus/node.cljc
Normal file
42
src/ludus/node.cljc
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
(ns ludus.node
|
||||||
|
(:require [ludus.interpreter :as i]
|
||||||
|
[ludus.grammar :as g]
|
||||||
|
[ludus.parser :as p]
|
||||||
|
[ludus.scanner :as s]
|
||||||
|
[ludus.prelude :as pre]
|
||||||
|
[ludus.show :as show]
|
||||||
|
[ludus.base :as base]
|
||||||
|
[ludus.data :as data]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(declare ld->clj)
|
||||||
|
|
||||||
|
(defn cljify [[k v]] [k (ld->clj v)])
|
||||||
|
|
||||||
|
(defn ld->clj [value]
|
||||||
|
(case (base/get-type value)
|
||||||
|
(:nil :number :string :boolean :keyword :set) value
|
||||||
|
|
||||||
|
(:list :tuple) (into [] (map ld->clj) (rest value))
|
||||||
|
|
||||||
|
(:dict :struct :ns) (into {} (map cljify) (dissoc value ::data/dict ::data/struct ::data/type ::data/name))
|
||||||
|
|
||||||
|
:ref (ld->clj @(::value value))
|
||||||
|
|
||||||
|
:fn (throw (ex-info (str "Cannot export functions from Ludus to Clojure. You tried exporting " (show/show value)) {}))))
|
||||||
|
|
||||||
|
(defn run [source]
|
||||||
|
(let [user_scanned (s/scan source)
|
||||||
|
user_tokens (:tokens user_scanned)
|
||||||
|
user_parsed (p/apply-parser g/script user_tokens)
|
||||||
|
user_result (i/interpret-safe source user_parsed {})
|
||||||
|
post_scanned (s/scan pre/postlude)
|
||||||
|
post_tokens (:tokens post_scanned)
|
||||||
|
post_parsed (p/apply-parser g/script post_tokens)
|
||||||
|
post_result (i/interpret-safe source post_parsed {})
|
||||||
|
ludus_result (assoc post_result :result user_result)
|
||||||
|
clj_result (ld->clj ludus_result)
|
||||||
|
]
|
||||||
|
#?(:clj clj_result :cljs (clj->js clj_result))
|
||||||
|
))
|
|
@ -1,16 +0,0 @@
|
||||||
(ns ludus.node
|
|
||||||
(:require [ludus.interpreter :as i]
|
|
||||||
[ludus.grammar :as g]
|
|
||||||
[ludus.parser :as p]
|
|
||||||
[ludus.scanner :as s])
|
|
||||||
)
|
|
||||||
|
|
||||||
(defn run [source]
|
|
||||||
(let [scanned (s/scan source)
|
|
||||||
tokens (:tokens scanned)
|
|
||||||
parsed (p/apply-parser g/script tokens)
|
|
||||||
result (i/interpret-safe source parsed {})]
|
|
||||||
(clj->js {:result result
|
|
||||||
:errors []
|
|
||||||
:console []
|
|
||||||
:draw []})))
|
|
11
src/ludus/postlude.ld
Normal file
11
src/ludus/postlude.ld
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
& this file runs after any given interpretation
|
||||||
|
& the goal is to output any global state
|
||||||
|
|
||||||
|
if turtle_state() :visible? then render_turtle! () else nil
|
||||||
|
|
||||||
|
#{
|
||||||
|
& :result result is provided elsewhere
|
||||||
|
:errors [] & if we get here there are no errors
|
||||||
|
:console deref (console)
|
||||||
|
:draw deref (p5_calls)
|
||||||
|
}
|
|
@ -7,3 +7,9 @@
|
||||||
:clj (slurp "src/ludus/prelude.ld")
|
:clj (slurp "src/ludus/prelude.ld")
|
||||||
:cljs (r/inline "./prelude.ld")
|
:cljs (r/inline "./prelude.ld")
|
||||||
))
|
))
|
||||||
|
|
||||||
|
(def postlude
|
||||||
|
#?(
|
||||||
|
:clj (slurp "src/ludus/postlude.ld")
|
||||||
|
:cljs (r/inline "./postlude.ld")
|
||||||
|
))
|
|
@ -125,9 +125,24 @@ fn append {
|
||||||
(xs as :set, x) -> base :conj (xs, x)
|
(xs as :set, x) -> base :conj (xs, x)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ref console = []
|
||||||
|
|
||||||
|
fn add_msg! {
|
||||||
|
"Adds a message to the console."
|
||||||
|
(msgs) -> {
|
||||||
|
let strs = map (show, msgs)
|
||||||
|
let msg = fold (concat, strs, "")
|
||||||
|
update! (console, append (_, msg))
|
||||||
|
:ok
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn print! {
|
fn print! {
|
||||||
"Sends a text representation of Ludus values to the console."
|
"Sends a text representation of Ludus values to the console."
|
||||||
(...args) -> base :print (args)
|
(...args) -> {
|
||||||
|
base :print (args)
|
||||||
|
add_msg! (args)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn show {
|
fn show {
|
||||||
|
@ -694,23 +709,26 @@ let turtle_angle = 0.375
|
||||||
let turtle_color = (100, 100, 100, 100)
|
let turtle_color = (100, 100, 100, 100)
|
||||||
|
|
||||||
fn render_turtle! () -> {
|
fn render_turtle! () -> {
|
||||||
let state = do turtle_state > deref > last
|
let state = do turtle_states > deref > last
|
||||||
if state :visible?
|
if state :visible?
|
||||||
then {
|
then {
|
||||||
add_call! ((:push))
|
add_call! ((:push))
|
||||||
let (r, g, b, a) = turtle_color
|
let (r, g, b, a) = turtle_color
|
||||||
add_call! ((:fill, r, g, b, a))
|
add_call! ((:fill, r, g, b, a))
|
||||||
add_call! ((:noStroke))
|
add_call! ((:noStroke))
|
||||||
let #{heading, position} = state
|
let #{heading, :position (x, y)} = state
|
||||||
|
add_call! ((:translate, x, y))
|
||||||
add_call! ((:rotate, turn/deg (heading)))
|
add_call! ((:rotate, turn/deg (heading)))
|
||||||
add_call! ((:beginShape))
|
add_call! ((:beginShape))
|
||||||
let head_unit = heading/vec (heading)
|
let head_unit = heading/vector (heading)
|
||||||
let first = mult (head_unit, turtle_radius)
|
let first = mult (head_unit, turtle_radius)
|
||||||
let second = rotate (first, turtle_angle)
|
let (x1, y1) = first
|
||||||
let third = rotate (first, neg (turtle_angle))
|
let (x2, y2) = rotate (first, turtle_angle)
|
||||||
add_call! ((:vertex, first))
|
let (x3, y3) = rotate (first, neg (turtle_angle))
|
||||||
add_call! ((:vertex, second))
|
add_call! ((:vertex, x1, y1))
|
||||||
add_call! ((:vertx, third))
|
add_call! ((:vertex, x2, y2))
|
||||||
|
add_call! ((:vertex, x3, y3))
|
||||||
|
add_call! ((:endShape))
|
||||||
add_call! ((:pop))
|
add_call! ((:pop))
|
||||||
:ok
|
:ok
|
||||||
}
|
}
|
||||||
|
@ -911,6 +929,7 @@ ns prelude {
|
||||||
inc
|
inc
|
||||||
dec
|
dec
|
||||||
print!
|
print!
|
||||||
|
console
|
||||||
show
|
show
|
||||||
prn!
|
prn!
|
||||||
type
|
type
|
||||||
|
@ -991,4 +1010,5 @@ ns prelude {
|
||||||
heading/vector
|
heading/vector
|
||||||
turtle_state
|
turtle_state
|
||||||
p5_calls, turtle_states, turtle_commands
|
p5_calls, turtle_states, turtle_commands
|
||||||
|
render_turtle!
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user