diff --git a/package.json b/package.json index 095ff81..4eeda31 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ludus/ludus-js-pure", - "version": "0.1.0-alpha.7.6", + "version": "0.1.0-alpha.7.7", "description": "A Ludus interpreter in a pure JS function.", "main": "target/js/ludus.js", "directories": {}, diff --git a/src/ludus/error.cljc b/src/ludus/error.cljc index 548087d..22f2cf4 100644 --- a/src/ludus/error.cljc +++ b/src/ludus/error.cljc @@ -6,6 +6,8 @@ the_line (nth lines (dec line))] the_line)) +(string/split-lines "abcd") + (defn get-underline [source {:keys [line start lexeme]} prefix] (let [lines (string/split-lines source) lines-before (subvec lines 0 (dec line)) @@ -37,3 +39,4 @@ (str "Ludus panicked on line " line ":\n" (get-line source {:line line}) "\n" message) (str "Ludus panicked!\n" message) )) + diff --git a/src/ludus/grammar.cljc b/src/ludus/grammar.cljc index 92d24cc..2290430 100644 --- a/src/ludus/grammar.cljc +++ b/src/ludus/grammar.cljc @@ -58,11 +58,11 @@ (quiet :rbrace) ]) -(defp struct-pattern group order-1 [(quiet :startstruct) - (quiet (zero+ separator)) - (zero+ dict-pattern-entry) - (quiet :rbrace) - ]) +; (defp struct-pattern group order-1 [(quiet :startstruct) +; (quiet (zero+ separator)) +; (zero+ dict-pattern-entry) +; (quiet :rbrace) +; ]) (defp guard order-0 [(quiet :if) simple]) @@ -75,7 +75,7 @@ :else tuple-pattern dict-pattern - struct-pattern + ;struct-pattern list-pattern]) (defp match-clause group weak-order [pattern (maybe guard) (quiet :rarrow) expression]) @@ -141,14 +141,15 @@ (defp pair group order-0 [:keyword non-binding]) +;; "struct-term" and "struct-entry" are necessary for nses (defp struct-term flat choice [:word pair]) (defp struct-entry order-1 [struct-term separators]) -(defp struct-literal group order-1 [(quiet :startstruct) - (quiet (zero+ separator)) - (zero+ struct-entry) - (quiet :rbrace)]) +; (defp struct-literal group order-1 [(quiet :startstruct) +; (quiet (zero+ separator)) +; (zero+ struct-entry) +; (quiet :rbrace)]) (defp dict-term flat choice [splat :word pair]) @@ -230,7 +231,8 @@ (defp repeat-expr group order-1 [(quiet :repeat) (choice :times [:word :number]) block]) -(defp collection flat choice [struct-literal dict list-literal set-literal tuple]) +(defp collection flat choice [;struct-literal + dict list-literal set-literal tuple]) (defp simple flat choice [literal collection synthetic recur-call lambda]) diff --git a/src/ludus/interpreter.cljc b/src/ludus/interpreter.cljc index 516d69b..6b8b470 100644 --- a/src/ludus/interpreter.cljc +++ b/src/ludus/interpreter.cljc @@ -442,7 +442,7 @@ (throw (ex-info (str "Struct error: no member at " kw) {:ast kw})))) (get map kw)))))) -(defn- call-fn [lfn args ctx] +(defn- call-fn [lfn args ctx from] ;(println "Calling function " (:name lfn)) (cond (= ::data/partial (first args)) @@ -452,7 +452,8 @@ (call-fn lfn (into [::data/tuple] (replace {::data/placeholder arg} (rest args))) - ctx))} + ctx + from))} (= (::data/type lfn) ::data/clj) (apply (:body lfn) (next args)) @@ -492,7 +493,7 @@ (interpret-ast body fn-ctx))) (recur (first clauses) (rest clauses)))) - (throw (ex-info (str "Match Error: No match found for " (show/show args) " in function " (:name lfn)) {:ast (:ast lfn)}))))) + (throw (ex-info (str "Match Error: No match found for " (show/show args) " in function " (:name lfn)) {:ast from}))))) (keyword? lfn) (if (= 2 (count args)) @@ -531,7 +532,7 @@ (throw (ex-info (str "Namespace error: no member " (:value curr) " in ns " (::data/name prev-value)) {:ast curr})) (throw (ex-info (str "Struct error: no member " (:value curr)) {:ast curr})))) (get prev-value (first data))) - (call-fn prev-value (interpret-args data ctx) ctx)))) + (call-fn prev-value (interpret-args data ctx) ctx curr)))) (defn- interpret-synthetic [ast ctx] ;;(println "interpreting synthetic " ast) @@ -606,7 +607,7 @@ (let [data (:data ast) root (interpret-ast (first data) ctx) fns (rest data)] - (reduce #(call-fn (interpret-ast %2 ctx) [::data/tuple %1] ctx) root fns))) + (reduce #(call-fn (interpret-ast %2 ctx) [::data/tuple %1] ctx ast) root fns))) (defn- map-values [f] (map (fn [kv] @@ -773,9 +774,9 @@ :pair (let [data (:data member) k (-> data first :data first) v (second data)] (assoc struct k (interpret-ast v ctx)))))) -(defn- interpret-struct [ast ctx] - (let [members (:data ast)] - (assoc (reduce (struct-term ctx) {} members) ::data/struct true))) +; (defn- interpret-struct [ast ctx] +; (let [members (:data ast)] +; (assoc (reduce (struct-term ctx) {} members) ::data/struct true))) (defn- ns-term [ctx] (fn [ns member] @@ -882,8 +883,8 @@ :dict (interpret-dict ast ctx) - :struct-literal - (interpret-struct ast ctx) + ; :struct-literal + ; (interpret-struct ast ctx) (throw (ex-info (str "Unknown AST node type " (get ast :type :err) " on line " (get-in ast [:token :line])) {:ast ast})))) diff --git a/src/ludus/node.cljc b/src/ludus/node.cljc index 163e2ef..a1708b3 100644 --- a/src/ludus/node.cljc +++ b/src/ludus/node.cljc @@ -33,7 +33,9 @@ (defn run [source] (let [user_scanned (s/scan source) user_tokens (:tokens user_scanned) + _ (println "Tokens: " user_tokens) user_parsed (p/apply-parser g/script user_tokens) + _ (println "Ast: " (i/prettify-ast user_parsed)) user_result (i/interpret-safe source user_parsed {}) result_str (show/show user_result) post_scanned (s/scan pre/postlude) @@ -57,3 +59,4 @@ (clean-out clj_result) ) )) + diff --git a/src/ludus/prelude.ld b/src/ludus/prelude.ld index 0abb743..e3e62f9 100644 --- a/src/ludus/prelude.ld +++ b/src/ludus/prelude.ld @@ -920,7 +920,7 @@ fn assert! { & some basic colors &&& TODO: add colors -let colors = @{ +let colors = #{ :white (255, 255, 255, 255) :light_gray (150, 150, 150, 255) :dark_gray (50, 50, 50, 255) diff --git a/src/ludus/scanner.cljc b/src/ludus/scanner.cljc index c273907..b0a9fde 100644 --- a/src/ludus/scanner.cljc +++ b/src/ludus/scanner.cljc @@ -281,10 +281,10 @@ (add-token (advance scanner) :startset) (add-error scanner (str "Expected beginning of set: ${. Got " char next))) - ;; struct @{ - \@ (if (= next \{) - (add-token (advance scanner) :startstruct) - (add-error scanner (str "Expected beginning of struct: @{. Got " char next))) + ;; struct @{: Deleted from the language in December 2023 + ; \@ (if (= next \{) + ; (add-token (advance scanner) :startstruct) + ; (add-error scanner (str "Expected beginning of struct: @{. Got " char next))) ;; placeholders ;; there's a flat _, and then ignored words diff --git a/target/repl-port b/target/repl-port new file mode 100644 index 0000000..8dbb69f --- /dev/null +++ b/target/repl-port @@ -0,0 +1 @@ +51500 \ No newline at end of file