web-dev-qa-db-ja.com

REPLを終了する方法

REPLを終了しようとしています。

私が使う (. System exit 0)または(System/exit 0)、しかしそれはエラーを引き起こします:

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

REPLを終了する別の方法はありますか?このエラーを解決するにはどうすればよいですか?

31
patz

「ファイルの終わり」文字を送信できます。

Ctrl-d(* nix)またはctrl-z(Windows)を押すだけでREPLを終了できます。

42
Sean Corfield

コードに別の問題があるようです。

Replを終了する方法is(System/exit 0)

代替構文(. System exit 0)も機能します。

次のコードで始まるクリーンなreplからこれをテストできます:Java -cp clojure.jar clojure.main -r

あなたが得る例外は、コードが意図した出口点に到達する前に、明らかに別のスレッドで、いくつかのインデックス付きルックアップでエラーを示しているようです。

20
Alex Stoddard

(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プロンプトでは、センチネルオブジェクトにアクセスできないため、フォームの入力が完了したことを評価者に通知するためにオブジェクトを返すことはできません。独自のリーダーをインストールすることで、特定のフォーム(たとえば、シンボルexit)を確認し、このフォームが読み取られるたびに番兵オブジェクトを返すことができるため、実際にkillすることなく、replを終了する準備ができていることを評価者に示すことができます。 VM全体。

6
Jeff Schwab

私は自分の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!
4
Andreas Guther

次のキーの組み合わせを使用してCiderを終了できますREPL emacs:C-c C-q

3
Samrat Debroy

「lein」をインストールすると、次のようにexitまたはquitになります。

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

今日私は答えを持っています、これは私が必要なものです

(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))
1
patz

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

これはストックClojure REPLの場合であることに注意してください-Datomic Shell(これはJava Beanshellのインスタンスのようです)を実行している場合)を入力します。 "終了する();"...

HTH。

0

replを終了するには:コマンドラインからreplを実行している場合(Seanが言及しているように)ctrl-d
スライムから実行している場合は、Alt-x slime-quit-LISPで実行する必要があります。 Eclipseから実行している場合 きれいな方法があるのか​​わかりません 小さな赤いボタンを使用してください。

0
Arthur Ulfeldt