2011-12-01 11 views
3

私は、リファクタリングされた2.9.xクラスを使用して、スカラREPL API(ILoopなど)用のラッパーを用意しています。REPL ILoopをプログラム的に中断する

これはうまくいきます。このよう

は、ユーザーに出荷ツールは、それがユーザーのようなものを入力しますことも可能です:

while(-1 < 1) {} 

をどのようにすることができますcurrentlly実行コードからユーザブレーク?

他の記事は、適切なキーバインディングの下にいくつかのプラットフォーム上で作業の程度

<ctrl> + <c> 

種類を話しています。

スカラREPL APIと使用可能なドキュメントを調べると、これを実際に実装する方法が煩わしくありません。

+1

Unixプラットフォームでは、ctrl cは単にSIGINTシグナルをプロセスに送信します。それはあなたがこれを扱う方法に依存します。 – foowtf

+0

信号をトラッピングすることは問題ではありません。一度トラップされると、ILoopや他の関連するクラスのどの場所で現在のコマンド実行を中断するかを突き止めます。 –

答えて

1

ILoopInit.scalaのファイル内のScala REPL does itを確認してください。そこ次シグナル割り込みハンドラがインストールされている、ILoopInitの自己型であるフィールドintp: IMainがクラスILoopに定義されていることを

protected def installSigIntHandler() { 
    // .... 
    SignalManager("INT") = { 
     if (intp == null || intp.lineManager == null) 
     onExit() 
     else if (intp.lineManager.running) 
     intp.lineManager.cancel() 
     // ... 
    } 
    } 

注意、。

要約すると、SIGINTハンドラでは、intp.lineManager.cancelでREPLを中断できます。

+0

いいです。ありがとう! –

関連する問題