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.
Ale*_*ard 21
看起来您的代码中存在不同的问题.
退出repl的方法是:(System/exit 0)
替代语法(. System exit 0)也有效.
你可以从一个干净的repl开始测试:
java -cp clojure.jar clojure.main -r
在您的代码到达预期的出口点之前,您获得的异常似乎表明某些索引查找中存在错误,显然是在另一个线程上.
(系统/退出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.
我只是想退出我的 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)
| 归档时间: |
|
| 查看次数: |
20475 次 |
| 最近记录: |