运行脚本并获取每行结果

时间:2015-02-13 19:42:00

标签: scala

我想编写一个简单的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尚未评估,我无法弄清楚如何,或者这是否值得追求

1 个答案:

答案 0 :(得分:0)

在最糟糕的情况下,您可以toString修改后的树,然后拨打interpreter.interpret

val results = treeResult.get.map { tree: Tree => interpreter.interpret(tree.toString) }

似乎最好让其他文件评估为可以通过control解释的内容(例如使用scalaz Reader Monad和for / yield语法)。但我认为你有充分的理由希望通过一个额外的scala解释器来做到这一点。