From 4526952c9548f0d4983caedbb82c4741f461acd5 Mon Sep 17 00:00:00 2001 From: Stuart Halloway Date: Fri, 22 Feb 2013 09:55:20 -0500 Subject: [PATCH] CLJ-1168: bind *read-eval* to "known" value for all REPL reads --- src/clj/clojure/main.clj | 14 ++++++++++---- 1 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/clj/clojure/main.clj b/src/clj/clojure/main.clj index ec1bcf7..fb776ef 100644 --- a/src/clj/clojure/main.clj +++ b/src/clj/clojure/main.clj @@ -183,6 +183,13 @@ by default when a new command-line REPL is started."} repl-requires [clojure.java.javadoc :refer (javadoc)] [clojure.pprint :refer (pp pprint)]]) +(defmacro with-read-known + "Evaluates body with *read-eval* set to a \"known\" value, + i.e. substituting true for :unknown if necessary." + [& body] + `(binding [*read-eval* (if (= :unknown *read-eval*) true *read-eval*)] + ~@body)) + (defn repl "Generic, reusable, read-eval-print loop. By default, reads from *in*, writes to *out*, and prints exception summaries to *err*. If you use the @@ -247,8 +254,7 @@ by default when a new command-line REPL is started."} repl-requires (fn [] (try (let [read-eval *read-eval* - input (binding [*read-eval* (if (= :unknown read-eval) true read-eval)] - (read request-prompt request-exit))] + input (with-read-known (read request-prompt request-exit))] (or (#{request-prompt request-exit} input) (let [value (binding [*read-eval* read-eval] (eval input))] (print value) @@ -297,12 +303,12 @@ by default when a new command-line REPL is started."} repl-requires [str] (let [eof (Object.) reader (LineNumberingPushbackReader. (java.io.StringReader. str))] - (loop [input (read reader false eof)] + (loop [input (with-read-known (read reader false eof))] (when-not (= input eof) (let [value (eval input)] (when-not (nil? value) (prn value)) - (recur (read reader false eof))))))) + (recur (with-read-known (read reader false eof)))))))) (defn- init-dispatch "Returns the handler associated with an init opt" -- 1.7.3.5