2011-12-01 2 views
3

У меня есть обертка для scala REPL api (ILoop и т. Д.), Используя классы refactored 2.9.x.прерывание REPL ILoop программно

это хорошо работает.

, как это инструмент поставляется пользователям, возможно, пользователь будет вводить что-то вроде:

while(-1 < 1) {} 

как может пролом пользователя из currentlly исполняемого кода?

другие сообщения говорят о

<ctrl> + <c> 

вид работы на некоторых платформах при соответствующих привязок клавиш.

проверяет scala REPL api и любые доступные документы, это не опасно, как на самом деле реализовать это.

+1

На платформах Unix ctrl c просто отправит сигнал SIGINT вашему процессу. Это зависит от того, как вы справляетесь с этим. – foowtf

+0

Улавливание сигнала не является проблемой. но однажды пойманное в ловушку, какое место в ILoop или в другом соответствующем классе, я пытаюсь прервать текущую текущую команду. –

ответ

1

Посмотрите, как Scala REPL does it в файле ILoopInit.scala. Там следующий обработчик прерываний сигнала установлен,

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

Обратите внимание, что поле intp: IMain определен в классе ILoop, который является само-тип ILoopInit.

Подводя итог: в вашем обработчике SIGINT вы можете прервать REPL с помощью intp.lineManager.cancel.

+0

приятный. Благодаря! –

Смежные вопросы