Оценить строковую команду в Scala из REPL


Есть ли способ оценить произвольную строку из Scala, как если бы тот же текст был введен в Scala REPL напрямую? Я имею в виду, я хотел бы сделать что-то вроде этого:

scala> eval("val x = 42")

scala> x
res2: Int = 42

Поскольку Scala REPL принимает команды в цикле eval, используя jline (я полагаю), а затем компилирует/интерпретирует его, должен быть способ представить произвольную строку текста. Я готов взломать Scala REPL, если это необходимо.

2 4

2 ответа:

Нет необходимости в повторном взломе-просто переключитесь в режим power user, который дает вам доступ к текущему scala.tools.nsc.interpreter.IMain как 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

Это работает по крайней мере с 2.9.1.

Еще одна возможность-использовать Eval из утилиты Twitter:

val x: Int = new Eval()("1 + 1")