如何退出REPL

pat*_*atz 29 clojure exit read-eval-print-loop

我正试图退出REPL.

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

Exception in thread "Thread-3" java.lang.RuntimeException: java.lang.IndexOutOfBoundsException
Run Code Online (Sandbox Code Playgroud)

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

Sea*_*eld 43

您可以发送"文件结束"字符.

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

  • @PhilGoetz我从未见过Clojure REPL中的ctrl-d关闭它运行的终端(除非你有一个带有lein repl的*nix用户作为他们的登录shell?). (2认同)

Ale*_*ard 21

看起来您的代码中存在不同的问题.

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

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

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

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


Jef*_*wab 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))))
Run Code Online (Sandbox Code Playgroud)

clojure.main/repl重复调用一个读取器,默认为repl-read,一次获取一个表单.读者的一个论点是一个特殊的哨兵对象,当没有更多的表格需要阅读时,读者应该返回该对象.默认读取器repl-read仅在EOF上返回sentinel值.在repl-read提示符下,您无权访问sentinel对象,因此您无法返回它以告知评估者您已完成输入表单.通过安装自己的阅读器,您可以检查特定的表单 - 例如符号exit - 并在读取此表单时返回sentinel对象,从而向评估者指示您已准备好退出repl,而不会实际查找整个VM.


Sam*_*roy 5

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


And*_*her 5

我只是想退出我的 REPL 并降落在这里。

这似乎是每个人在开始在 Clojure REPL 中做第一步时都会想到的一个问题。当然,我没有阅读启动消息。如其他回复所述,我的 Clojure 1.7.0 的答案是 (exit) 或 (quit) 或 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!
Run Code Online (Sandbox Code Playgroud)