从REPL中评估Scala中的字符串命令

时间:2012-08-12 15:29:00

标签: scala read-eval-print-loop

有没有办法从Scala中评估任意字符串,就像直接在Scala REPL中输入相同的文本一样?我的意思是,我想做这样的事情:

scala> eval("val x = 42")

scala> x
res2: Int = 42

由于Scala REPL使用jline接受eval循环中的命令(我相信)然后编译/解释它,因此必须有一种方法来提交任意一行文本。如果有必要,我愿意破解Scala REPL。

2 个答案:

答案 0 :(得分:12)

无需REPL黑客攻击 - 只需切换到超级用户模式,即可以intp访问当前scala.tools.nsc.interpreter.IMain

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。

答案 1 :(得分:2)

另一个机会是使用Twitter Utility中的Eval

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