Внутренняя компиляция скалы. Работа с интерактивом. Глобал - PullRequest
3 голосов
/ 10 мая 2010

Я пытаюсь получить AST из файла scala souce. Я упростил код (только соответствующий код) до следующего.

trait GetAST {
     val settings = new Settings
     val global = new Global(settings, new ConsoleReporter(settings))
     def getSt = "hello" //global.typedTree(src, true)
}
object Tre extends GetAST {
    def main(args:Array[String])
    {
        println(getSt.getClass)
        println("exiting program")
    }
}

Приведенный выше код прекрасно компилируется и работает нормально. Но проблема в том, что программа не выходит. Приглашение не отображается после печати «Выход из программы». Я должен использовать ^ C, чтобы выйти. Любая идея, в чем может быть проблема

Ответы [ 2 ]

3 голосов
/ 10 мая 2010

Я верю, что Майкл прав, компилятор использует Threads, и поэтому JVM не просто завершается.

Хорошая новость заключается в том, что interactive.Global смешивает черту interactive.CompilerControl, метод которой askShutdown, которую вы можете вызвать в конце своей основной функции, чтобы позволить программе выйти.

2 голосов
/ 10 мая 2010

Не зная, что такое Settings, Global и ConsoleReporter, никто не может дать вам точный ответ. Я предполагаю, что по крайней мере один из них создает поток. JVM ожидает, пока все потоки не будут завершены (или все запущенные не являются потоками deamon). Смотри здесь .

Я бы поспорил, если вы закомментируете строки settings и global, и они выйдут, как и ожидалось.

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