2016-06-27 2 views
1

J'utilise Scala toolbox pour évaluer du code Scala pour un interpréteur Web. Il fonctionne bien, le code ressemble à ceci:En utilisant Scala Toolbox eval, comment définir la valeur I que je peux utiliser dans les evals postérieurs?

import scala.reflect.runtime.universe._ 
import scala.tools.reflect.ToolBox 

object Eval { 
    val toolbox = runtimeMirror(getClass.getClassLoader).mkToolBox() 

    def eval[T](code: String): T = { 
    toolbox.eval(toolbox.parse(code)).asInstanceOf[T] 
    } 
} 

je peux faire quelque chose comme:

Eval.eval[Long]("1 + 1") 

et obtenir 2 retour. La question se pose quand je veux définir quelque chose:

Eval.eval[Unit]("val yellow = 5") 
Eval.eval[Long]("yellow") 

Je reçois une erreur not found: value yellow. Comment puis-je définir une valeur que je peux utiliser dans des évaluations ultérieures avec Scala Toolbox?

Merci!

Répondre

1

Pour un environnement persistant, vous pouvez utiliser REPL de Scala directement. Voir la note JSR-223 tout en bas du 2.11 release notes.

import javax.script.ScriptEngineManager 

class DummyClass 

object Evaluator { 
    val engine = new ScriptEngineManager().getEngineByName("scala") 
    val settings = engine.asInstanceOf[scala.tools.nsc.interpreter.IMain].settings 
    settings.embeddedDefaults[DummyClass] 
    engine.eval("val x: Int = 5") 
    val thing = engine.eval("x + 9").asInstanceOf[Int] 
} 

La nécessité d'DummyClass (ou vraiment une classe que vous avez peut se substituer à DummyClass) découle d'un peu de manigances ici due to SBT and classloader concerns (plus de détails) here.

+0

Ah c'est génial! Le seul problème est maintenant comment puis-je obtenir l'exception qui s'est produite * dans * le moteur s'il y avait une erreur dans le script? En ce moment, il retourne juste une exception ScriptException et '.getMessage()' renvoie 'javax.script.ScriptException: erreur de compilation», même si la cause réelle est imprimée au terminal? – prismofeverything