2011-02-13 12 views
21

Estoy intentando salir de REPL.Cómo salir de REPL

utilizo (. System exit 0) o (System/exit 0), pero que provoca un error:

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

¿Hay otra manera de salir de la réplica? ¿Cómo puedo resolver este error?

+1

yo añadiría pregunta más específica: cuál es la manera de matar la réplica con código, no comandos externos ... – Nevena

Respuesta

35

puede enviar el carácter 'EOF'.

puede pulsar Ctrl-D (* nix) o Ctrl-Z (Windows) para salir de la réplica.

+0

gracias por responder pero necesito que el programa termine automáticamente, mi "archive.clj" tiene código y al final el (. Sistema exit 0) – patz

+1

@patz ¿por qué está ejecutando un programa automático en modo REPL? –

+0

No; al escribir ctrl-d en repl también se cierra el terminal en el que se ejecutó telnet. –

0

para salir de la réplica: Si se está ejecutando el repl desde la línea de comandos entonces (como menciona Sean) Ctrl-D
si se está ejecutando desde el limo luego Alt-x limo-quit-Lisp debe hazlo. si lo está ejecutando desde eclipse, entonces no estoy seguro de que haya una forma limpia de salir use el pequeño botón rojo.

+0

en Eclipse puede utilizar botoncito rojo .. – Nevena

+0

gracias por responder pero necesito que el programa terminará automáticamente, mi " archive.clj "tiene código y al final el (. Sistema exit 0) – patz

17

Parece que usted tiene un problema diferente en el código.

La manera de salir de la réplica es : (System/exit 0)

La sintaxis alternativa (. System exit 0) también funciona.

Usted puede probar esto de un sust limpia comenzó con: java -cp clojure.jar clojure.main -r

La excepción se obtiene lo que parecería indicar un error en alguna de búsqueda indexada antes de que su código obtiene al punto de salida prevista, al parecer, en un subproceso diferente .

+0

borré todo el código de mi main, y comencé el repl, cuando escribo (System/exit 0) continúa dándome este error ... – patz

+0

¿Cómo está comenzando la réplica? ¿Es desde dentro de un IDE? Algo sobre su configuración no coincide con las expectativas habituales. El ejemplo anterior fue con una repuesta iniciada desde la línea de comandos. –

+0

Uso el terminal de Linux para comenzar la réplica con - lein repl-en la carpeta de mi proyecto. en la carpeta src/myproyect el archivo core.clj no tiene código (y es el: mai n de mi project.clj) ... cuando empiezo la réplica no tengo problemas, escribo a conciencia (Sistema/salida 0) y tengo el error =/ – patz

6

El problema con (Sistema/salida 0) es que mata a toda la JVM. La verdadera pregunta es cómo salir programáticamente de solo la respuesta actual y volver a la función que se lanzó.

Aquí es un truco conveniente:

(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 pide de nuevo un lector, por repl-leer, por defecto para conseguir una forma a la vez. Uno de los argumentos para el lector es un objeto centinela especial que el lector debe devolver cuando ya no hay más formularios para leer. El lector predeterminado, repl-read, devuelve el valor centinela solo en EOF. En el prompt de repl-read, no tiene acceso al objeto centinela, por lo que no puede devolverlo para decirle al evaluador que ha terminado de ingresar formularios. Al instalar su propio lector, puede buscar un formulario particular, por ejemplo, el símbolo de salida, y devolver el objeto centinela siempre que se lea este formulario, indicando así al evaluador que está listo para salir de la réplica, sin matar en realidad todo el VM.

1

hoy tengo la respuesta, esto es lo que necesito

(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

En Windows (probado en Windows 7 x64), utilizando la consola de comandos estándar (cmd.exe), el Ctrl-Z (seguido por la tecla enter) el carácter parece ser el indicador de fin de archivo, me dejó fuera de la REPL de vuelta al símbolo del sistema. Sospecho que esto también funcionará de manera equivalente en Windows PowerShell. Si alguien está familiarizado con él, pruebe y confirme ...

Tenga en cuenta también que esto es para la población Clojure REPL - si está ejecutando la cáscara Datomic (que parece ser una instancia de una Beanshell Java), escriba "quit();" ...

HTH .

0

puede usar la siguiente combinación de teclas para salir REPL sidra en emacs: C-c C-q

0

Si instala "Lein" entonces es exit o quit así:

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