Skip to content

Commit 4526952

Browse files
CLJ-1168: bind *read-eval* to "known" value for all REPL reads
1 parent 68c4962 commit 4526952

File tree

1 file changed

+10
-4
lines changed

1 file changed

+10
-4
lines changed

src/clj/clojure/main.clj

+10-4
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)