5

Is there a way to evaluate a arbitrary string from Scala as if the same text was entered into the Scala REPL directly? I mean, I would like to do something like this:

scala> eval("val x = 42")

scala> x
res2: Int = 42

Since the Scala REPL is accepting commands in an eval loop using jline (I believe) and then compiling/interpreting it, there has to be a way to submit an arbitrary line of text. I am willing to hack the Scala REPL if necessary.

Jim
  • 1,740
  • 2
  • 13
  • 18

2 Answers2

14

No REPL hacking necessary—just switch to power user mode, which gives you access to the current scala.tools.nsc.interpreter.IMain as intp:

scala> :power
** Power User mode enabled - BEEP BOOP SPIZ **
** :phase has been set to 'typer'.          **
** scala.tools.nsc._ has been imported      **
** global._ and definitions._ also imported **
** Try  :help,  vals.<tab>,  power.<tab>    **

scala> intp.interpret("val x = 42")
x: Int = 42
res0: scala.tools.nsc.interpreter.package.IR.Result = Success

scala> x
res1: Int = 42

This works since at least 2.9.1.

Travis Brown
  • 138,631
  • 12
  • 375
  • 680
2

Another opportunity is to use Eval from Twitter Utility:

val x: Int = new Eval()("1 + 1")
om-nom-nom
  • 62,329
  • 13
  • 183
  • 228
  • I don't think there's any way to use Eval to do what the question asks—to evaluate a string defining a `val` and have that variable be visible to the REPL (if I'm wrong please correct me). – Travis Brown Aug 12 '12 at 17:19
  • @TravisBrown you're right: the same level of comfort is not possible. – om-nom-nom Aug 14 '12 at 21:42