@@ -183,6 +183,13 @@ by default when a new command-line REPL is started."} repl-requires
183
183
[clojure.java.javadoc :refer (javadoc )]
184
184
[clojure.pprint :refer (pp pprint)]])
185
185
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
+
186
193
(defn repl
187
194
" Generic, reusable, read-eval-print loop. By default, reads from *in*,
188
195
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
247
254
(fn []
248
255
(try
249
256
(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))]
252
258
(or (#{request-prompt request-exit} input)
253
259
(let [value (binding [*read-eval* read-eval] (eval input))]
254
260
(print value)
@@ -297,12 +303,12 @@ by default when a new command-line REPL is started."} repl-requires
297
303
[str]
298
304
(let [eof (Object. )
299
305
reader (LineNumberingPushbackReader. (java.io.StringReader. str))]
300
- (loop [input (read reader false eof)]
306
+ (loop [input (with- read-known ( read reader false eof) )]
301
307
(when-not (= input eof)
302
308
(let [value (eval input)]
303
309
(when-not (nil? value)
304
310
(prn value))
305
- (recur (read reader false eof)))))))
311
+ (recur (with- read-known ( read reader false eof) )))))))
306
312
307
313
(defn- init-dispatch
308
314
" Returns the handler associated with an init opt"
0 commit comments