56 votes

"eval" en Scala

Peut Scala être utilisé pour écrire le script d'une application Java?

J'ai besoin de charger un morceau de code Scala à partir de Java, mettre en place une étendue d'exécution (les données exposées par l'application hôte), de l'évaluer et de récupérer un objet de résultat.

La documentation Scala montre comment il est facile d'appeler compilé Scala code de Java (car il devient régulier de bytecode JVM).

Mais comment puis-je évaluer un Scala expression à la volée (à partir de Java ou si c'est plus facile, à partir de l'intérieur de la Scala) ?

Pour de nombreuses autres langues, il est l'javax.l'interface de script. Scala ne semble pas à le soutenir, et je ne pouvais pas trouver quoi que ce soit dans le Java/Scala interopérabilité docs qui ne dépend pas d'avance sur le temps de compilation.

66voto

ninjagecko Points 25709

Nous sommes maintenant en 2011 et vous pouvez le faire avec scala.tools.nsc.Interpreter

voir http://blog.darevay.com/2009/01/remedial-scala-interpreting-scala-from-scala/

53voto

Daniel Spiewak Points 30706

Scala n'est pas un langage de script. Il peut regarder un peu comme un langage de script, et les gens peuvent défendre à cette fin, mais il ne correspond vraiment pas bien dans la JSR 223 scripting framework (qui est orienté vers typées dynamiquement les langues). Pour répondre à votre question initiale, à la Scala de ne pas avoir un eval fonctionner, comme Java ne dispose pas d'un eval. Une telle fonction n'aurait pas vraiment de sens pour l'une de ces langues, compte tenu de leur intrinsèquement de nature statique.

Mon conseil: repenser votre code, de sorte que vous n'avez pas besoin d' eval (vous faites rarement, même dans les langues qui ont, comme le Rubis). Sinon, peut-être que vous ne voulez pas être en utilisant Scala à tous pour cette partie de votre application. Si vous avez vraiment besoin d' eval, essayez d'utiliser JRuby. JRuby, Scala et Java maillage très bien ensemble. Il est assez facile d'avoir une partie de votre système en Java, une partie de Scala et une autre partie (le peu qui exige eval) en Ruby.

22voto

Oswaldo Points 168

Scala a ajouté un support officiel à JSR-223 dans la version 2.11 ( https://issues.scala-lang.org/browse/SI-874 ).

Donc, si vous en avez toujours besoin après avoir réfléchi aux considérations formulées dans la réponse actuellement acceptée de Daniel Spiewak (à propos de repenser d'une manière inutile), cela devrait être l'alternative officielle.

16voto

Robey Pointer Points 168

Vous pouvez émuler "eval" en prenant scala code, en l'enveloppant dans une classe, de compiler cette classe, à l'aide de réflexion afin de créer une nouvelle instance, puis en l'appelant. C'est un peu impliqué, et le compilateur scala est très lente (de l'ordre de 2 secondes) pour initialiser, mais il fonctionne très bien.

Il y a une bibliothèque pour elle ici, appelé "util-eval": https://github.com/twitter/util/

Le code en question de la vie ici: https://github.com/twitter/util/blob/master/util-eval/src/main/scala/com/twitter/util/Eval.scala

Il fonctionne comme ceci:

val sum = Eval[Int]("1 + 1")
// sum will be 2

3voto

Daniel Ribeiro Points 1992

Eh bien, scala ne supporte pas officiellement jsr 223 (mais jrr), mais certaines personnes ont fait de leur mieux:

http://code.google.com/p/netgents/downloads/list

Plus d'informations sur le fil de trac officiel de scalas: http://lampsvn.epfl.ch/trac/scala/ticket/874

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X