From a65b4ba873ad1f7629465b085fd43afbe1c45f06 Mon Sep 17 00:00:00 2001 From: Scott Richmond Date: Tue, 9 Jan 2024 23:42:56 -0500 Subject: [PATCH] Keep working on translating parser --- janet/parser.janet | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/janet/parser.janet b/janet/parser.janet index d631836..c9e2152 100644 --- a/janet/parser.janet +++ b/janet/parser.janet @@ -1,3 +1,6 @@ +### in repl, make sure to (os/cwd) into the janet dir +(import ./clj-loop :prefix "") + (defn ? [val default] (if (nil? val) default val)) (defn ok? [{:status status}] @@ -180,7 +183,7 @@ {:name name :rule (fn order-fn [tokens] (let [origin (first tokens)] - (loop [ps parsers + (clj-loop [ps parsers # now we can use my handy macro results [] ts tokens] (let [result (apply-parser (first ps) ts) @@ -220,21 +223,23 @@ (:err :none) (update result :trace |(array/push $ name))))))))}) - (defn quiet [parser] {:name (kw+str (? (get parser :name) parser) "-quiet") :rule (fn quiet-fn [tokens] (let [result (apply-parser parser tokens)] (if (pass? result) - (assoc result :status :quiet) + (put result :status :quiet) result)))}) +### Start here +### How to write variadic functions here that preserve this logic +### Janet doesn't allow for Clojure's multiple clauses, :( (defn zero+ ([parser] (zero+ (pname parser) parser)) ([name parser] {:name (kw+str name "-zero+") :rule (fn zero+fn [tokens] - (loop [results [] + (clj-loop [results [] ts tokens] (let [result (apply-parser parser ts)] (case (get result :status) @@ -310,14 +315,16 @@ :rule (fn group-fn [tokens] (let [result (apply-parser parser tokens)] (if (= :group (get result :status)) - (assoc result :status :ok) + (put result :status :ok) result)))})) -(defn err-msg [{token :token trace :trace}] - (println "Unexpected token " (get token :type) " on line " (get token :line)) - (println "Expected token " (first trace))) +(defn err-msg [{:token token :trace trace}] + (print "Unexpected token " (get token :type) " on line " (get token :line)) + (print "Expected token " (first trace))) + +(defn butlast [xs] (if (empty? xs) [] (slice xs 0 -2))) (defmacro defp [name & items] (let [arg (last items) - fns (into [] (butlast items))] - `(defn ~name [] ((apply comp ~fns) (keyword '~name) ~arg)))) + fns (butlast items)] + ~(defn ,name [] ((apply comp ,fns) (keyword ',name) ,arg))))