Как выйти из РЕПЛ

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

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

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

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


person patz    schedule 13.02.2011    source источник
comment
Я бы добавил более конкретный вопрос: как убить repl кодом, а не внешними командами..   -  person Nevena    schedule 13.02.2011
comment
Хорошо работает очистка с помощью java -jar clojure.jar для Clojure 1.11.0-master-SNAPSHOT. Я предполагаю, что использование версии linnux или версии brew в Mac требует работы с (выход)   -  person Abdurrahman Adebiyi    schedule 06.08.2019


Ответы (10)


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

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

person Sean Corfield    schedule 13.02.2011
comment
спасибо за ответ, но мне нужно, чтобы программа завершилась автоматически, мой archive.clj имеет код и в конце (. System exit 0) - person patz; 14.02.2011
comment
@patz, почему вы запускаете автоматическую программу в режиме REPL? - person Robert P; 19.04.2012
comment
Нет; ввод ctrl-d в repl также закрывает терминал, в котором вы запускали telnet. - person Phil Goetz; 23.01.2014
comment
@PhilGoetz Я никогда не видел, чтобы ctrl-d в Clojure REPL закрывал терминал, в котором он работал (если только у вас нет пользователя * nix с lein repl в качестве оболочки входа в систему ??). - person Sean Corfield; 12.02.2014
comment
Я в Windows с PowerShell, Ctrl-D не выходит из реплики Clojure :( - person Michael Butler; 23.04.2014

Моему ответу уже 10 лет, и ему дали контекст с меньшим пониманием (хотя я думаю, что разделил ту же путаницу, что и первоначальный спрашивающий, так что это вроде как работает).

(System/exit 0) действительно выходит из всей JVM - это может быть то, что вы хотите выйти из REPL, но не обязательно. Clojure и его REPL предназначены для работы в многопоточной среде, и вы даже можете подключить несколько REPL к одному и тому же процессу. Очевидно, что выход из JVM - это не то, что вам нужно, если вы хотите выйти из REPL в продолжающемся процессе.

Оригинальный ответ ниже:

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

Выход из реплики это:(System/exit 0)

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

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

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

person Alex Stoddard    schedule 14.02.2011
comment
Я удалил весь код из моего основного и запустил repl, когда я пишу (System/exit 0) продолжает выдавать мне эту ошибку... - person patz; 14.02.2011
comment
Как вы запускаете repl - это из среды IDE? Что-то в вашей настройке не соответствует обычным ожиданиям. Вышеприведенный пример был с репликой, запущенной из командной строки. - person Alex Stoddard; 14.02.2011
comment
Я использую терминал Linux, чтобы начать repl с -lein repl- в папке моего проекта. в папке src/myproyect архив core.clj не имеет кода (и является: main моего проекта.clj)... когда я запускаю реплику, у меня нет проблем, сразу пишет (System / exit 0) и у меня ошибка =/ - person patz; 16.02.2011
comment
Попробуйте вещи за пределами дерева проекта полностью. Как с помощью простой команды Java выше, так и с помощью lein repl. (Вы должны иметь возможность получить реплику без какого-либо проекта, созданного с помощью lein). Что-то в коде или структуре вашего проекта, вероятно, вызывает проблему. Возможно, у вас есть код, который оценивается до того, как будет вызвана ваша основная функция. - person Alex Stoddard; 16.02.2011
comment
Пробую с пустым проектом (только основную информацию кто поставил lein) и когда пишу (System/exit 0) выдает ту же ошибку, в папке без проекта (с repl clojure.core) проблем нет выход - person patz; 16.02.2011
comment
Так что похоже, что это что-то в вашем проекте настроено. Возможно, вы могли бы вставить свой файл project.clj и любые другие во что-то вроде gist.github.com, иначе я сомневаюсь, что люди могут помочь дальше. - person Alex Stoddard; 17.02.2011
comment
наконец, я создаю файл jar, когда я запускаю java -jar myproyect.jar, у меня нет проблем с (Syste.exit 0) - person patz; 17.02.2011

Проблема с (System/exit 0) заключается в том, что он убивает всю JVM. Реальный вопрос заключается в том, как программно выйти только из текущего repl и вернуться к любой функции, запущенной этим repl.

Вот удобный лайфхак:

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

person Jeff Schwab    schedule 09.07.2011

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

person Samrat Debroy    schedule 27.05.2017
comment
Настоящий ответ!!! Потому что все, что он спросил, это как мне ВЫХОДИТЬ, а не как мне выйти и убить! - person rezwits; 30.09.2018

я просто хотел выйти из 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!
person Andreas Guther    schedule 26.05.2018
comment
На моем Mac с помощью brew установил clojure для версии Clojure 1.10.1 (exit) с ошибкой user=> (exit) Syntax error compiling at (REPL:1:1). Unable to resolve symbol: exit in this context . Я должен был использовать ( (. Выход системы 0) для перемещения. @andreas-guther Я вижу заголовок ... nREPL server .... в вашем. Версия 1.7 и ниже работала с exit out из коробки - person Abdurrahman Adebiyi; 06.08.2019

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

$ lein repl
...
user=>exit
Bye for now!
person rogerdpack    schedule 09.11.2017

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

person Arthur Ulfeldt    schedule 13.02.2011
comment
спасибо за ответ, но мне нужно, чтобы программа завершилась автоматически, мой archive.clj имеет код и в конце (. System exit 0) - person patz; 14.02.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))
person patz    schedule 23.11.2011

На Mac дважды нажмите CTRL + C, см.:

REPL Image

person Owans    schedule 22.04.2020

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

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

ХТН.

person Michael R. Mayne    schedule 06.06.2014