Проблема с (System / exit 0) состоит в том, что он убивает всю JVM. На самом деле вопрос заключается в том, как программно выйти из текущей реплики и вернуться к любой функции, запущенной в этой реплике.
Вот удобный хак:
(clojure.main/repl
; Exit the repl whenever the user enters "exit" at the prompt.
:read (fn [request-prompt request-exit]
(let [form (clojure.main/repl-read request-prompt request-exit)]
(if (= 'exit form) request-exit form))))
clojure.main / repl неоднократно вызывает читателя, по умолчанию repl-read, чтобы получить по одной форме за раз. Один из аргументов читателя - это специальный объект-страж, который читатель должен вернуть, когда больше нет форм для чтения. Средство чтения по умолчанию, repl-read, возвращает значение часового только в EOF. В приглашении repl-read у вас нет доступа к объекту sentinel, поэтому вы не можете вернуть его, чтобы сообщить оценщику, что вы завершили ввод форм. Установив свой собственный ридер, вы можете проверить конкретную форму - например, символ выхода - и возвращать сторожевой объект всякий раз, когда эта форма читается, указывая, таким образом, оценщику, что вы готовы выйти из repl, фактически не убивая вся ВМ.