Clojure 如何退出REPL

Clojure 如何退出REPL,clojure,exit,read-eval-print-loop,Clojure,Exit,Read Eval Print Loop,我正试图退出REPL 我使用(.System exit 0)或(System/exit 0),但这会导致错误: Exception in thread "Thread-3" java.lang.RuntimeException: java.lang.IndexOutOfBoundsException 是否有其他方法退出REPL?如何解决此错误?您可以发送“文件结束”字符 只需按ctrl-d(*nix)或ctrl-z(Windows)即可退出REPL 要退出repl,请执行以下操作: 如果您是从

我正试图退出REPL

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

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

是否有其他方法退出REPL?如何解决此错误?

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

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

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

您的代码中似乎有不同的问题

退出repl的方法是:
(系统/退出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))))

clojure.main/repl反复调用读卡器(默认情况下为repl read),以一次获取一个表单。读卡器的一个参数是一个特殊的sentinel对象,当没有更多的表单要读取时,读卡器应该返回该对象。默认读取器repl read仅在EOF上返回sentinel值。在repl read提示下,您无权访问sentinel对象,因此无法返回该对象以告知计算器您已完成表单输入。通过安装自己的读卡器,您可以检查特定表单(例如,符号exit),并在读取该表单时返回sentinel对象,从而向计算器指示您已准备好退出repl,而不会实际杀死整个VM。

今天我有了答案,这就是我需要的

(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))
在Windows(在Windows 7 x64上测试)中,使用标准命令shell(cmd.exe),ctrl-Z(后跟enter键)字符似乎是文件结束指示器,它将我从REPL中拖回命令提示符。我怀疑这在Windows PowerShell中也同样有效,请熟悉它的人测试并确认

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


HTH.

您可以使用以下组合键退出emacs中的苹果酒复制:
C-C-q
如果您安装了“lein”,则它是
退出
退出
,如下所示:

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

我只是想离开我的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!
在Mac上,使用CTRL+C两次,请参见:


我想补充一个更具体的问题:用代码而不是外部命令杀死repl的方法是什么..使用clojure 1.11.0-master-SNAPSHOT的
java-jar clojure.jar
。我猜在mac中使用linnux版本或brew版本需要与(退出)一起工作感谢响应,但我需要程序自动完成,我的“archive.clj”有代码,最后(.System exit 0)感谢响应,但我需要程序自动完成,我的“archive.clj”有代码,最后(.System exit 0)@patz为什么在REPL模式下运行自动程序;在repl中键入ctrl-d也会关闭您运行telnet的终端。@PhilGoetz我从未在Clojure repl中看到过ctrl-d关闭它运行的终端(除非您有一个*nix用户,其登录shell是lein repl???)。我在使用PowerShell的Windows上,ctrl-d不会退出Clojure repl:(我在写入(系统/退出0)时,删除了main中的所有代码,并启动了repl)继续告诉我这个错误…你是如何启动repl的?它是从IDE中启动的吗?你的设置与通常的期望不符。上面的例子是从命令行启动的repl。…我使用linux终端在我的项目文件夹中以-lein repl-开始repl。…在src/myproyect文件夹中rchive core.clj没有代码(并且是我的project.clj的:main)。(您应该能够在不使用lein设置任何项目的情况下获得repl)。有关您的项目代码或结构的某些内容可能会导致此问题。可能您的某个代码在调用主函数之前正在进行评估。因此,它似乎是您的项目设置中的某个内容。也许您可以将您的project.clj文件和任何其他文件粘贴到类似的内容上,否则我怀疑人们是否可以进一步提供帮助真正的答案!!!因为他问的只是我如何退出,而不是如何退出和杀死!在我的Mac电脑上,使用brew安装的clojure for verion clojure 1.10.1
(退出)
失败,在(REPL:1:1)处编译时出现错误
user=>(退出)语法错误。无法解析符号:在此上下文中退出
。我无法使用((.System EXIT 0)移动。@andreas guther我在你的文件中看到了标题…nREPL服务器…。1.7版及以下版本是否可以使用
exit
开箱即用