3 Stimmen

Interne Scala-Kompilierung. Arbeiten mit interactive.Global

Ich versuche, die AST von Scala-Source-Datei abzurufen. Ich habe den Code (nur relevanten Code) zu folgenden vereinfacht.

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")
    }
}

Der obige Code lässt sich gut kompilieren und läuft gut. Aber das Problem ist, dass das Programm nicht beendet wird. Die Eingabeaufforderung wird nach dem Drucken von "Exiting Program" nicht angezeigt. Ich muss ^c zum Beenden verwenden. Irgendeine Idee, was das Problem sein könnte

3voto

Mirko Stocker Punkte 2212

Ich glaube, Michael hat recht, der Compiler verwendet Threads und deshalb beendet sich die JVM nicht einfach.

Die gute Nachricht ist, dass interactive.Global mischt sich ein interactive.CompilerControl Eigenschaft, deren askShutdown Methode, die Sie am Ende Ihres main aufrufen können, um das Programm zu beenden.

2voto

michael.kebe Punkte 10440

Ohne zu wissen, was Settings , Global y ConsoleReporter sind, kann Ihnen niemand eine genaue Antwort geben. Ich würde vermuten, dass mindestens einer von ihnen einen Thread erstellt. Die JVM wartet, bis alle Threads fertig sind (oder alle laufenden Threads Deamon-Threads sind). Siehe aquí .

Ich würde wetten, wenn Sie die settings y global Zeilen wird es wie erwartet beendet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X