36

我正在尝试退出 REPL。

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

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

有没有其他方法可以退出 REPL?我该如何解决这个错误?

4

10 回答 10

47

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

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

于 2011-02-13T03:19:44.857 回答
26

我的答案现在已经 10 年了,并且被赋予了一个不太理解的背景(尽管我认为我和最初的提问者有同样的困惑,所以它有点工作)。

(System/exit 0)确实退出了整个 JVM - 这可能是您想要“退出 REPL”但不一定。Clojure 和它的 REPL 被设计为在多线程环境中运行,您甚至可以将多个 REPL 连接到同一个进程。显然,如果您想在其他继续过程中退出 REPL,则退出 JVM 不是您想要的。

原答案如下:

看起来您的代码中有不同的问题。

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

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

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

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

于 2011-02-14T15:35:33.367 回答
7

(System/exit 0) 的问题在于它会杀死整个 JVM。真正的问题是如何以编程方式仅退出当前的 repl,并返回到启动该 repl 的任何函数。

这是一个方便的hack:

(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,而无需实际杀死整个虚拟机。

于 2011-07-09T15:29:19.130 回答
6

我只是想退出我的 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!
于 2018-05-26T04:43:03.740 回答
5

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

于 2017-05-27T08:53:23.567 回答
3

如果您安装“lein”,那么它是这样exit的:quit

$ lein repl
...
user=>exit
Bye for now!
于 2017-11-09T21:09:08.090 回答
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))
于 2011-11-23T01:42:05.207 回答
1

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

于 2011-02-13T05:59:34.480 回答
1

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

REPL 图像

于 2020-04-22T17:52:48.223 回答
0

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

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

HTH。

于 2014-06-06T20:01:03.957 回答