it-swarm-ru.tech

Как выйти из REPL

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

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

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

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

28
patz

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

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

42
Sean Corfield

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

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

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

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

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

19
Alex Stoddard

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

6
Jeff Schwab

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

Это, кажется, вопрос, который приходит в голову каждому, когда он начинает делать первые шаги в Clojure REPL. И, конечно же, я не прочитал сообщение о запуске. Ответ на мой 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!
4
Andreas Guther

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

3
Samrat Debroy

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

$ lein repl
...
user=>exit
Bye for now!
1
rogerdpack

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

(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))
1
patz

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

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

НТН.

0
Michael R. Mayne

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

0
Arthur Ulfeldt