2010-05-10 6 views
3

J'essaie de récupérer l'AST à partir du fichier scala souce. J'ai simplifié le code (seul code pertinent) à suivre.Compilation interne de scala. Travailler avec interactive.Global

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

Le code ci-dessus compile bien et fonctionne bien. Mais le problème est que le programme ne sort pas. L'invite ne s'affiche pas après l'impression de "sortie de programme". Je dois utiliser^c pour quitter. Toute idée de ce que le problème pourrait être

Répondre

3

Je crois que Michael a raison, le compilateur utilise des Threads et donc la JVM ne se ferme pas simplement.

Les bonnes nouvelles sont que interactive.Global mélange en interactive.CompilerControl trait dont la méthode askShutdown vous pouvez appeler à la fin de votre main pour laisser le programme quitter.

+0

C'était exactement ce qui me manquait. Merci – scout

2

Sans savoir ce que Settings, Global et ConsoleReporter sont personne ne peut vous donner une réponse exacte. Je suppose qu'au moins l'un d'entre eux crée un fil. La JVM attend jusqu'à ce que tous les threads soient terminés (ou tous les threads en cours d'exécution sont des threads Deamon). Voir here.

Je serais prêt à parier que si vous commentez les lignes settings et global, il quittera comme prévu.

+0

Paramètres, Global et ConsoleReporter proviennent du compilateur scala standard. importation scala.tools.nsc.Settings importation scala.tools.nsc.interactive.Global importation scala.tools.nsc.reporters.ConsoleReporter – scout

Questions connexes