我正在尝试退出REPL。
我使用(. System exit 0)
或(System/exit 0)
,但这会导致错误:
Exception in thread "Thread-3" java.lang.RuntimeException: java.lang.IndexOutOfBoundsException
还有另一种退出REPL的方法吗?我如何解决这个错误?
答案 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"那么它exit
或quit
就像这样:
$ lein repl
...
user=>exit
Bye for now!
答案 7 :(得分:1)
在Mac上,使用 CTRL + C 两次,请参见:
答案 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。