diff --git a/deps.edn b/deps.edn index 60742be..43014bc 100644 --- a/deps.edn +++ b/deps.edn @@ -1,6 +1,7 @@ {:deps {org.clojure/clojurescript {:mvn/version "1.11.121"} - thheller/shadow-cljs {:mvn/version "2.26.0"}} + thheller/shadow-cljs {:mvn/version "2.26.0"} + } :aliases {:main diff --git a/package-lock.json b/package-lock.json index 2059526..c5f750f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,9 @@ "name": "ludus", "version": "1.0.0", "license": "ISC", + "dependencies": { + "p5": "^1.8.0" + }, "devDependencies": { "shadow-cljs": "^2.26.0" } @@ -707,6 +710,11 @@ "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", "dev": true }, + "node_modules/p5": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/p5/-/p5-1.8.0.tgz", + "integrity": "sha512-LHzRRl+aWEZVXmK+L9TDRNw5zm90wvwMdY7yTmsFkdNeXrU9n2KSZbonCTXkyGgriguovxJrDDgyhkynOxWB1A==" + }, "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", diff --git a/package.json b/package.json index 60701c5..86a99d1 100644 --- a/package.json +++ b/package.json @@ -15,5 +15,8 @@ "license": "ISC", "devDependencies": { "shadow-cljs": "^2.26.0" + }, + "dependencies": { + "p5": "^1.8.0" } } diff --git a/shadow-cljs.edn b/shadow-cljs.edn index 0b76c53..557d28a 100644 --- a/shadow-cljs.edn +++ b/shadow-cljs.edn @@ -1,6 +1,8 @@ ;; shadow-cljs configuration {:deps true + :dev-http {8234 "target"} + :builds {:node {:target :node-library :output-to "target/js/ludus.js" @@ -9,5 +11,5 @@ :modules {:main {:entries [ludus.core]}}} :browser {:target :browser :output-dir "target/js" - :asset-path "/assets" - :modules {:main {:entries [ludus.core]}}}}} + :asset-path "target" + :modules {:main {:init-fn ludus.web/init}}}}} diff --git a/src/ludus/core.cljc b/src/ludus/core.cljc index d77f84d..83ff37b 100644 --- a/src/ludus/core.cljc +++ b/src/ludus/core.cljc @@ -25,22 +25,4 @@ nil ) (let [interpreted (interpreter/interpret source parsed)] - (println (show/show interpreted)) - interpreted)))))) - -(defn main! [] - (println "Ludus says, hi there...") - - #?(:clj (println "...from Clojure.") - :cljs (println "...from ClojureScript.")) - - (run ":foo") - (run "add (1, 2)") - (run "nil") - (run "if true then :foo else :bar") - ) - -(run ":foo") -(run "add (1, 2)") -(run "nil") -(run "if true then :foo else :bar") \ No newline at end of file + (show/show interpreted))))))) \ No newline at end of file diff --git a/src/ludus/interpreter.cljc b/src/ludus/interpreter.cljc index 69fa87a..3a39a70 100644 --- a/src/ludus/interpreter.cljc +++ b/src/ludus/interpreter.cljc @@ -844,20 +844,20 @@ #?( :clj clojure.lang.ExceptionInfo :cljs js/Object - )) + )) ;; TODO: update this to use new parser pipeline & new AST representation -(defn interpret [source parsed] - (try - (let [base-ctx (volatile! {::parent (volatile! prelude/prelude)})] - (interpret-ast parsed base-ctx)) - (catch #?(:cljs :default :clj Throwable) e - (println "Ludus panicked!") - (println "On line" (get-in (ex-data e) [:ast :token :line])) - (println ">>> " (get-line source (get-in (ex-data e) [:ast :token :line]))) - (println (ex-message e)) - (pp/pprint (ex-data e) - ;;(System/exit 67) - )))) - -(+ 1 2) \ No newline at end of file +(defn interpret + ([source parsed] (interpret source parsed {})) + ([source parsed ctx] + (try + (let [base-ctx (volatile! {::parent (volatile! (merge prelude/prelude ctx))})] + (interpret-ast parsed base-ctx)) + (catch #?(:cljs :default :clj Throwable) e + (println "Ludus panicked!") + (println "On line" (get-in (ex-data e) [:ast :token :line])) + (println ">>> " (get-line source (get-in (ex-data e) [:ast :token :line]))) + (println (ex-message e)) + (pp/pprint (ex-data e) + ;;(System/exit 67) + ))))) \ No newline at end of file diff --git a/src/ludus/web.cljs b/src/ludus/web.cljs new file mode 100644 index 0000000..70e772e --- /dev/null +++ b/src/ludus/web.cljs @@ -0,0 +1,40 @@ +(ns ludus.web + (:require + [ludus.core :as core] + [goog.object :as o] + ) + ) + +(defn get-element [id] + (.getElementById (.-document js/window) id)) + +(def canv (get-element "canv")) + +(def code (get-element "code")) + +(def out (get-element "output")) + +(def play (get-element "play")) + +(defn run-code [] + (let [source (.-value code) + result (core/run source)] + (println "Running code:" source) + (o/set out "value" result))) + +(.addEventListener play "click" run-code) + +(defn setup [] + (js/createCanvas 640 240 canv) + (js/background 235) + ) + +(defn draw [] + (if js/mouseIsPressed + (js/fill 255) + (js/fill 155)) + (js/ellipse js/mouseX js/mouseY 80 80)) + +(doto js/window + (o/set "setup" setup) + (o/set "draw" draw)) \ No newline at end of file diff --git a/temp/turtle-graphics.clj b/temp/turtle-graphics.clj deleted file mode 100644 index c698752..0000000 --- a/temp/turtle-graphics.clj +++ /dev/null @@ -1,77 +0,0 @@ -(ns ludus.turtle-graphics - (:require [quil.core :as q] - [quil.middleware :as m])) - -(defn setup [] - (q/frame-rate 60) - (q/color-mode :rgb) - {:position [0 0] - :path []}) - -(def path (atom [])) - -(defn turns->degrees [turns] (mod (+ 90 (* -360 turns)) 360)) - -(turns->degrees -0.25) - -(defn degrees->turns [degs] (mod (/ (- degs 90) -360) 1)) - -(degrees->turns 360) - -(defn add [[x1 y1] [x2 y2]] [(+ x1 x2) (+ y1 y2)]) - -(defn sub [[x1 y1 [x2 y2]]] [(- x1 x2) (- y1 y2)]) - -(defn scale [[x y] m] [(* x m) (* y m)]) - -(defn heading->vec [heading] - (let [degs (turns->degrees heading)] - [(Math/cos degs) (Math/sin degs)])) - -(defn vec->heading [[x y]] - (degrees->turns (Math/atan2 x y))) - -(defn forward [steps] - (let [prev (peek @path) - heading (:heading prev) - unit (heading->vec heading) - move (scale unit steps) - curr (update prev :postion #(add % move))] - (swap! path #(conj % curr)))) - -(defn back [steps] (forward (* -1 steps))) - -(defn right [turns] - (let [prev (peek @path) - curr (update prev :heading #(- % turns))] - (swap! path #(conj % curr)))) - -(defn left [turns] (right (* -1 turns))) - -(comment - :path {:start [x y] :end [x y] :color [R G B]} - ) - -(defn update-state [state] - {:color (mod (+ (:color state) 0.7) 255) - :angle (+ (:angle state) 0.1)}) - -(defn draw-state [state] - (q/background 240) - (q/fill (:color state) 255 255) - (let [angle (:angle state) - x (* 150 (q/cos angle)) - y (* 150 (q/sin angle))] - (q/with-translation [(/ (q/width) 2) (/ (q/height) 2)] - (q/ellipse x y 100 100)))) - -(defn ludus-draw [] - (q/defsketch sketch - :title "Hello Ludus" - :size [500 500] - :setup setup - :update update-state - :draw draw-state - :features [] - :middleware [m/fun-mode]) - :ok) \ No newline at end of file