From 18bcf6d8c6e2b016d17e25870859f3a30cc4dea3 Mon Sep 17 00:00:00 2001 From: Scott Richmond Date: Fri, 27 May 2022 20:02:32 -0400 Subject: [PATCH] More minor repl improvements --- src/ludus/repl.clj | 123 ++++++++++++++++++++++++++------------------- 1 file changed, 72 insertions(+), 51 deletions(-) diff --git a/src/ludus/repl.clj b/src/ludus/repl.clj index 406449c..da4de64 100644 --- a/src/ludus/repl.clj +++ b/src/ludus/repl.clj @@ -1,11 +1,11 @@ (ns ludus.repl (:require - [ludus.scanner :as scanner] - [ludus.parser :as parser] - [ludus.interpreter :as interpreter] - [ludus.prelude :as prelude] - [ludus.show :as show] - [ludus.data :as data])) + [ludus.scanner :as scanner] + [ludus.parser :as parser] + [ludus.interpreter :as interpreter] + [ludus.prelude :as prelude] + [ludus.show :as show] + [ludus.data :as data])) (declare repl-prelude new-session) @@ -15,40 +15,59 @@ (def prompt "=> ") +(defn- exit [] + (println "\nGoodbye!") + (System/exit 0)) + (def base-ctx (merge prelude/prelude - {::repl true - "repl" - {::data/struct true - ::data/type ::data/ns - ::data/name "repl" + {::repl true + "repl" + {::data/struct true + ::data/type ::data/ns + ::data/name "repl" - :flush - {:name "flush" - ::data/type ::data/clj - :body (fn [] - (let [session @current-session] - (swap! session #(assoc % :ctx (volatile! base-ctx))) - :ok))} + :flush + {:name "flush" + ::data/type ::data/clj + :body (fn + ([] + (let [session @current-session] + (swap! session #(assoc % :ctx (volatile! base-ctx))) + :ok)) + ([name] + (if-let [session (get @sessions name)] + (do + (swap! session #(assoc % :ctx (volatile! base-ctx))) + :ok) + (do + (println "No session named" name) + :error))))} - :new - {:name "new" - ::data/type ::data/clj - :body (fn [name] - (let [session (new-session name)] - (reset! current-session session) - :ok))} + :new + {:name "new" + ::data/type ::data/clj + :body (fn [name] + (let [session (new-session name)] + (reset! current-session session) + :ok))} - :switch - {:name "switch" - ::data/type ::data/clj - :body (fn [name] - (if-let [session (get @sessions name)] - (do - (reset! current-session session) - :ok) - (do - (println "No session named" name) - :error)))}}})) + :switch + {:name "switch" + ::data/type ::data/clj + :body (fn [name] + (if-let [session (get @sessions name)] + (do + (reset! current-session session) + :ok) + (do + (println "No session named" name) + :error)))} + + :quit + {:name "quit" + ::data/type ::data/clj + :body (fn [] (exit))} + }})) (defn- new-session [name] (let [session (atom {:name name @@ -57,27 +76,29 @@ (swap! sessions #(assoc % name session)) session)) -(defn- exit [] - (println "\nGoodbye!") - (System/exit 0)) - (defn repl-loop [] (let [session-atom @current-session session @session-atom orig-ctx (:ctx session)] (print (str (:name session) prompt)) (flush) - (let [raw-input (read-line) - input (if raw-input raw-input (exit)) - parsed (-> input (scanner/scan) (parser/parse)) - {result :result ctx :ctx} (interpreter/interpret-repl parsed (:ctx session))] - (if (= result ::interpreter/error) - (repl-loop) - (do - (println (show/show result)) - (when (not (= @ctx @orig-ctx)) - (swap! session-atom #(assoc % :ctx ctx))) - (repl-loop)))))) + (let [raw-input (read-line)] + (cond + (= nil raw-input) (exit) + + (= "" raw-input) (recur) + + :else + (let [input (if raw-input raw-input (exit)) + parsed (-> input (scanner/scan) (parser/parse)) + {result :result ctx :ctx} (interpreter/interpret-repl parsed (:ctx session))] + (if (= result ::interpreter/error) + (recur) + (do + (println (show/show result)) + (when (not (= @ctx @orig-ctx)) + (swap! session-atom #(assoc % :ctx ctx))) + (recur)))))))) (defn launch [] (println "Welcome to Ludus (v. 0.1.0-alpha)")