2011-02-26 2 views

Répondre

11

Avez-vous essayé de fouiller dans scala.tools.nsc?

Est-ce que quelque chose comme ça suffit pour vos besoins (ou, au moins, un bon point de départ)?

scala> val interpreter = new tools.nsc.Interpreter 
interpreter: scala.tools.nsc.Interpreter = [email protected] 

scala> interpreter interpret "(3, 5)" 
res0: (Int, Int) = (3,5) 
res139: scala.tools.nsc.InterpreterResults.Result = Success 

scala> interpreter interpret "1 to 10 toList" 
res1: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 
res140: scala.tools.nsc.InterpreterResults.Result = Success 

[Modifier: il semble que tools.nsc.Interpreter est obsolète. Il y a maintenant un paquet tools.nsc.interpreter]

+0

C'est parfait - merci! – Bill

+0

Jetez également un oeil à 'eval'. Vous devez fournir des types, mais cela est particulièrement utile car il renvoie le type avec lequel l'expression se termine. –

1

Vous pouvez être intéressé par l'API du compilateur Scala. Vous devez probablement compiler la source et l'exécuter. C'est AFAIK comment c'est fait dans l'interprète de Scala.

Rappelez-vous ces questions:

  • Il peut être lent.
  • Cela peut être un goulot d'étranglement dans les applications multithread. Charger une classe AFAIK nécessite une synchronisation (à cause de JIT etc.).
  • Il peut être non sécurisé. Vous pouvez être intéressé par la définition de restrictions de sécurité JVM.

Il y a une info à propos de compilateur Scala (as in this thread), mais il peut être dépassée: Si vous avez besoin d'une information verbeux, vous devrez probablement télécharger la source et générer scaladoc.

Je ne suis pas votre motivation pour l'utiliser, mais vous pouvez également être intéressé par JSR 223: Scripting for the Java™ Platform API, si vous n'avez pas besoin de Scala.

Si vous souhaitez uniquement charger des structures de données, vous devez envisager d'autres moyens, par ex. Soulevez la bibliothèque JSON que vous pouvez download from Maven ou directly download. La bibliothèque vous permet de sérialiser/désérialiser les classes de cas.

+0

Merci! Le compilateur lui-même est probablement trop lourd. Je veux être capable de lire quelque chose comme "[Foo (3, 3)," foo ", 4]" et récupérer une structure de données Scala. Est-il un moyen de le faire sans utiliser l'API du compilateur? – Bill

+1

Eh bien, si vous voulez seulement lire une structure, qu'en est-il de l'utilisation de la désérialisation de Lift JSON? – v6ak

+2

et si json n'est pas votre poison, essayez le support de l'analyseur dans scala, qui est conçu pour fonctionner dans * exactement * de cette façon. –