Как выйти из REPL - PullRequest
       29

Как выйти из REPL

28 голосов
/ 13 февраля 2011

Я пытаюсь выйти из REPL.

Я использую (. System exit 0) или (System/exit 0), но это вызывает ошибку:

Exception in thread "Thread-3" java.lang.RuntimeException: java.lang.IndexOutOfBoundsException

Есть ли другой способ выйти из REPL? Как я могу решить эту ошибку?

Ответы [ 9 ]

42 голосов
/ 13 февраля 2011

Вы можете отправить символ конца файла.

Вы можете просто нажать ctrl-d (* nix) или ctrl-z (Windows), чтобы выйти из REPL.

19 голосов
/ 14 февраля 2011

Похоже, у вас другая проблема в вашем коде.

Способ выхода из repl - : (System/exit 0)

Альтернативный синтаксис (. System exit 0)также работает.

Вы можете проверить это из чистого репла, начинающегося с: java -cp clojure.jar clojure.main -r

Исключение, которое вы получите, может показывать ошибку в каком-то индексированном поиске до того, как ваш код доберется до предполагаемоготочка выхода, по-видимому, в другом потоке.

6 голосов
/ 09 июля 2011

Проблема с (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, фактически не убивая вся ВМ.

4 голосов
/ 26 мая 2018

Я просто хотел выйти из своего REPL и приземлился здесь.

Это, кажется, вопрос, который приходит в голову каждому, когда он начинает делать первые шаги в REPL Clojure.И, конечно же, я не прочитал сообщение о запуске.Ответ на мой Clojure 1.7.0 - это (выход) или (выход) или Control-d, как указано в других ответах.

nREPL server started on port 49276 on host 127.0.0.1 - nrepl://127.0.0.1:49276
REPL-y 0.3.7, nREPL 0.2.10
Clojure 1.7.0
Java HotSpot(TM) 64-Bit Server VM 1.8.0_72-b15
    Docs: (doc function-name-here)
          (find-doc "part-of-name-here")
  Source: (source function-name-here)
 Javadoc: (javadoc java-object-or-class-here)
    Exit: Control+D or (exit) or (quit)
 Results: Stored in vars *1, *2, *3, an exception in *e

user=> (exit)
Bye for now!
3 голосов
/ 27 мая 2017

Вы можете использовать следующую комбинацию клавиш для выхода из Cider REPL в emacs: C-c C-q

1 голос
/ 10 ноября 2017

Если вы установите «lein», то это exit или quit, например:

$ lein repl
...
user=>exit
Bye for now!
1 голос
/ 23 ноября 2011

сегодня у меня есть ответ, это то, что мне нужно

(import ('java.lang.management ManagementFactory)
(use 'clojure.contrib.shell)
(defn process-pid [] (let [m-name (.getName (ManagementFactory/getRuntimeMXBean))] (first (.split m-name "@"))))

(defn exit (sh "kill" (process-pid))
0 голосов
/ 07 июня 2014

В Windows (протестировано на Windows 7 x64), используя стандартную командную оболочку (cmd.exe), символ ctrl-Z (сопровождаемый клавишей ввода) представляется индикатором конца файла, он уронил меняиз REPL обратно в командную строку.Я подозреваю, что это также будет работать аналогично в Windows PowerShell, если кто-то из знакомых с ней протестирует и подтвердит ...

Обратите внимание, что это для стандартного Clojure REPL - если вы используете оболочку Datomic(который выглядит как экземпляр Java Beanshell), введите "quit ();" ...

HTH.

0 голосов
/ 13 февраля 2011

для выхода из repl: если вы запускаете repl из командной строки, тогда (как упоминает Шон) ctrl-d
, если вы запускаете его из slime, тогда Alt-x slime-quit-lisp должен сделатьЭто.если вы запускаете его из затмения, то я не уверен, что есть чистый способ выхода , используя маленькую красную кнопку.

...