2011-02-13 270 views
21

我试图退出REPL。如何退出REPL

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

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

有另一种方式来退出REPL?我如何解决这个错误?

+1

我想补充的更具体的问题:有什么办法杀死代码的repl,而不是外部命令.. – Nevena 2011-02-13 13:15:44

回答

35

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

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

+0

感谢您的回应 但我需要程序自动完成, 我的“archive.clj”有代码,并在最后(。系统退出0) – patz 2011-02-14 03:13:12

+1

@patz你为什么在REPL模式下运行自动程序? – 2012-04-19 16:29:54

+0

否;在repl中键入ctrl-d也会关闭你运行telnet的终端。 – 2014-01-23 04:58:21

0

退出REPL: 如果你正在运行在命令行的REPL然后(肖恩提到),CTRL-d
如果你从煤泥然后按Alt-X煤泥戒烟口齿不清应该运行它做到这一点。 如果你从eclipse运行它然后我不知道有一个干净的方式退出使用小红色按钮。

17

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

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

替代语法(. System exit 0)也适用。

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

你似乎表明在一些编索引的查找错误之前,你的代码获取到预期的出口点,显然是在不同的线程例外。

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读取,拿到一次一个形式。读者的一个论据是一个特殊的哨兵对象,读者在没有更多的表格可以阅读时应该返回。默认阅读器repl-read仅在EOF上返回标记值。在repl-read提示下,您无法访问标记对象,因此无法将其返回以告知评估者您已完成输入表单。通过安装自己的阅读器,您可以检查特定的表单(例如符号出口),并在读取该表单时返回标记对象,从而向评估者指示您准备好退出repl,而不会实际上进行查杀整个虚拟机。今天

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

在Windows(在Windows 7 64位系统测试),使用标准的命令shell(CMD.EXE),按Ctrl-Z(后跟回车键)字符看起来是文件结束指示符,它将我从REPL中删除回命令提示符。我怀疑这也将在Windows PowerShell中等效工作,请熟悉它的人请测试并确认...

还请注意,这是股票的Clojure REPL - 如果你正在运行的Datomic外壳(这似乎是一个Java的BeanShell的实例),进入“退出();” ......

HTH 。

0

您可以使用下列组合键退出在Emacs苹果酒REPL:C-c C-q

0

如果您安装了“雷音”,那么它的exitquit这样的:

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