@@ -183,6 +183,13 @@ by default when a new command-line REPL is started."} repl-requires
183183 [clojure.java.javadoc :refer (javadoc )]
184184 [clojure.pprint :refer (pp pprint)]])
185185
186+ (defmacro with-read-known
187+ " Evaluates body with *read-eval* set to a \" known\" value,
188+ i.e. substituting true for :unknown if necessary."
189+ [& body]
190+ `(binding [*read-eval* (if (= :unknown *read-eval*) true *read-eval*)]
191+ ~@body))
192+
186193(defn repl
187194 " Generic, reusable, read-eval-print loop. By default, reads from *in*,
188195 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
247254 (fn []
248255 (try
249256 (let [read-eval *read-eval*
250- input (binding [*read-eval* (if (= :unknown read-eval) true read-eval)]
251- (read request-prompt request-exit))]
257+ input (with-read-known (read request-prompt request-exit))]
252258 (or (#{request-prompt request-exit} input)
253259 (let [value (binding [*read-eval* read-eval] (eval input))]
254260 (print value)
@@ -297,12 +303,12 @@ by default when a new command-line REPL is started."} repl-requires
297303 [str]
298304 (let [eof (Object. )
299305 reader (LineNumberingPushbackReader. (java.io.StringReader. str))]
300- (loop [input (read reader false eof)]
306+ (loop [input (with- read-known ( read reader false eof) )]
301307 (when-not (= input eof)
302308 (let [value (eval input)]
303309 (when-not (nil? value)
304310 (prn value))
305- (recur (read reader false eof)))))))
311+ (recur (with- read-known ( read reader false eof) )))))))
306312
307313(defn- init-dispatch
308314 " Returns the handler associated with an init opt"
0 commit comments