прерывание REPL ILoop программно - PullRequest
3 голосов
/ 01 декабря 2011

У меня есть оболочка для API-интерфейса scala REPL (ILoop и т. Д.) С использованием переработанных классов 2.9.x.

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

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

while(-1 < 1) {}

как пользователь может оторваться от текущего выполняемого кода?

в других публикациях рассказывается о

<ctrl> + <c> 

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

проверяя API-интерфейс scala REPL и все доступные документы, неясно, как на самом деле это реализовать.

1 Ответ

1 голос
/ 05 декабря 2011

Проверьте, как Scala REPL делает это в файле 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...