我想编写一个简单的Scala脚本,它运行在另一个文件中定义的一些方法。
运行此方法的每一行都需要在运行时才能使用的信息。为简单起见,我想抽出那部分。
因此,我想使用Currying来获取脚本中每行的结果,然后使用额外的数据再次运行结果。
object TestUtil {
// "control" is not known until runtime
def someTestMethod(x: Int, y: Int)(control: Boolean): Boolean = {
if (control) {
assert(x == y)
x == y
} else {
assert(x > y)
x > y
}
}
}
someTestMethod在我的主代码库中定义。
// testScript.sc
import <whateverpath>.TestUtil
TestUtil.someTestMethod(2,1)
TestUtil.someTestMethod(5,5)
每一行都应该返回一个函数,我需要用布尔值重新运行。
val control: Boolean = true
List[(Boolean) -> Boolean) testFuncs = runFile("testScript.sc")
testFuncs.foreach(_(control)) // Run all the functions that testScripts defined
(对不起,如果这是一个奇怪的例子,它是我能想到的最简单的事情)
到目前为止,我已经想出如何解析脚本,并获得树。但是在那时我无法弄清楚如何执行每个单独的树对象并获得结果。这基本上就是我被困的地方!
val settings = new scala.tools.nsc.GenericRunnerSettings(println)
settings.usejavacp.value = true
settings.nc.value = true
val interpreter: IMain = new IMain(settings)
val treeResult: Option[List[Tree]] = interpreter.parse(
"""true
| 5+14""".stripMargin)
treeResult.get.foreach((tree: Tree) => println(tree))
结果是
真
5. $加(14)
其中5 + 14尚未评估,我无法弄清楚如何,或者这是否值得追求
答案 0 :(得分:0)
在最糟糕的情况下,您可以toString
修改后的树,然后拨打interpreter.interpret
:
val results = treeResult.get.map { tree: Tree => interpreter.interpret(tree.toString) }
似乎最好让其他文件评估为可以通过control
解释的内容(例如使用scalaz Reader Monad和for / yield语法)。但我认为你有充分的理由希望通过一个额外的scala解释器来做到这一点。