2012-08-12 72 views
4

有没有一种方法来评估Scala中的任意字符串,就好像相同的文本直接输入到Scala REPL中一样?我的意思是,我愿做这样的事情:从REPL评估Scala中的字符串命令

scala> eval("val x = 42") 

scala> x 
res2: Int = 42 

由于斯卡拉REPL使用的JLine(我相信)接受在一个eval循环命令,然后编译/解释它,必须有办法提交任意一行文字。如果有必要,我愿意破解Scala REPL。

+0

有可能是一个更简单的方法,但最糟糕的情况下,你可以随时将其写入到一个文件,并使用load()方法 – 2012-08-12 15:55:22

回答

12

没有REPL黑客必要,只需切换到超级用户模式,使您可以访问到当前scala.tools.nsc.interpreter.IMainintp

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。

+0

真棒!太棒了。正是我在找什么。非常感谢! – Jim 2012-08-12 22:43:40

2

另一个机会是使用Eval从Twitter工具:

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

我不认为有什么办法可以使用Eval来完成问题所要求的 - 评估一个定义“val”的字符串并让该变量对REPL可见(如果我错了,请纠正我)。 – 2012-08-12 17:19:39

+0

@TravisBrown你是对的:同样的舒适程度是不可能的。 – 2012-08-14 21:42:59