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 を起動した関数に戻る方法です。

これは便利なハックです:

(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) を繰り返し呼び出して、一度に 1 つのフォームを取得します。リーダーへの引数の 1 つは、読み取るフォームがなくなったときにリーダーが返すことになっている特別なセンチネル オブジェクトです。デフォルトのリーダーである repl-read は、EOF でのみセンチネル値を返します。repl-read プロンプトでは、sentinel オブジェクトにアクセスできないため、それを返して、フォームの入力が完了したことを評価者に伝えることはできません。独自のリーダーをインストールすることで、特定のフォーム (シンボル exit など) をチェックし、このフォームが読み込まれるたびにセンチネル オブジェクトを返すことができます。これにより、実際に強制終了することなく、repl を終了する準備ができていることを評価者に示すことができます。 VM全体。

于 2011-07-09T15:29:19.130 に答える
1

replを終了するには:コマンドラインからreplを実行している場合は、(Seanが言及しているように)ctrl-d
をslimeから実行している場合は、Alt-xslime-quit-lispで実行する必要があります。Eclipseから実行している場合は、小さな赤いボタンを使用して終了するクリーンな方法があるかどうかわかりません。

于 2011-02-13T05:59:34.480 に答える
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

On Mac, use CTRL + C twice, see:

REPL Image

于 2020-04-22T17:52:48.223 に答える
0

Windows (Windows 7 x64 でテスト済み) では、標準のコマンド シェル (cmd.exe) を使用して、ctrl-Z (エンター キーが続く) 文字がファイルの終わりのインジケーターのように見えます。 REPL コマンド プロンプトに戻ります。これは Windows PowerShell でも同様に機能すると思われます。詳しい方はテストして確認してください...

また、これはストック Clojure REPL 用であることにも注意してください。Datomic シェル (Java Beanshell のインスタンスのように見えます) を実行している場合は、「quit();」と入力してください...

HTH。

于 2014-06-06T20:01:03.957 に答える