如何退出REPL

时间:2011-02-13 00:22:57

标签: clojure exit read-eval-print-loop

我正在尝试退出REPL。

我使用(. System exit 0)(System/exit 0),但这会导致错误:

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

还有另一种退出REPL的方法吗?我如何解决这个错误?

10 个答案:

答案 0 :(得分:42)

您可以发送'文件结尾'字符。

您只需按ctrl-d(* nix)或ctrl-z(Windows)即可退出REPL。

答案 1 :(得分:19)

您的代码中似乎有不同的问题。

退出repl 的方法是(System/exit 0)

替代语法(. System exit 0)也有效。

你可以从一个干净的repl开始测试: java -cp clojure.jar clojure.main -r

在您的代码到达预期的出口点之前,您获得的异常似乎表明某些索引查找中存在错误,显然是在另一个线程上。

答案 2 :(得分:6)

(系统/退出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上返回sentinel值。在repl-read提示符下,您无权访问sentinel对象,因此您无法返回它以告知评估者您已完成输入表单。通过安装自己的阅读器,您可以检查特定的表单 - 例如符号exit - 并在读取此表单时返回sentinel对象,从而向评估者指示您已准备好退出repl,而不会实际查找整个VM。

答案 3 :(得分:3)

您可以使用以下组合键在emacs中退出Cider REPL:C-c C-q

答案 4 :(得分:3)

我只想退出我的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!

答案 5 :(得分:1)

今天我有答案,这就是我需要的

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

答案 6 :(得分:1)

如果您安装" lein"那么它exitquit就像这样:

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

答案 7 :(得分:1)

在Mac上,使用 CTRL + C 两次,请参见:

REPL Image

答案 8 :(得分:0)

退出repl: 如果你从命令行运行repl,那么(如Sean所提到的)ctrl-d
如果你是从slime运行它,那么Alt-x slime-quit-lisp应该这样做。 如果你是从eclipse运行那么我不确定是否有一个干净的退出方式使用小红色按钮。

答案 9 :(得分:0)

在Windows(在Windows 7 x64上测试)中,使用标准命令shell(cmd.exe),ctrl-Z(后跟输入键)字符似乎是文件结束指示符,它让我失望了退出REPL返回命令提示符。我怀疑这也会在Windows PowerShell中等效运行,熟悉它的人请测试并确认...

另请注意,这是针对股票Clojure REPL的 - 如果您运行的是Datomic shell(它似乎是Java Beanshell的一个实例),请输入“quit();”...

HTH。