2015-02-13 4 views
1

Я хочу написать простой скрипт 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

В худшем случае вы можете toString вашего модифицированного дерево, а затем вызвать interpreter.interpret:

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

Похоже, что было бы лучше иметь другой файл оценить что-то, что может быть истолковано прохождением control (например, используя скалярный считыватель Monad и синтаксис for/yield). Но я предполагаю, что у вас есть веские причины для этого, используя дополнительный интерпретатор scala.

Смежные вопросы