如何在使用scala.tools.nsc.interpreter.IMain时动态绑定变量

时间:2016-03-31 01:54:08

标签: scala interpreter

我试图实现一个类来评估给定的scala脚本和输入值的结果,并使用scala.tools.nsc.interpreter.IMain打印评估结果。这是我的测试代码。

package some.test.package

import javax.script.{Compilable, CompiledScript}

import scala.tools.nsc.Settings
import scala.tools.nsc.interpreter.{IMain, JPrintWriter}

class Evaluator {

  // Create IMain instance when created
  val settings = new Settings()
  settings.usejavacp.value = true
  val writer = new JPrintWriter(Console.out, true)
  val engine = new IMain(settings, writer)
  val compiler = engine.asInstanceOf[Compilable]

  var inputVal : Int = _
  var compiledObj : CompiledScript = _

  // compile given script
  def compileScript(givenCode : String) {
    compiledObj = compiler.compile(givenCode)
  }

  // evaluate
  def evalCompiled(): Unit = {
    compiledObj.eval()
  }

  // set input value
  def setInput(givenInput:Int) {
    inputVal = givenInput
  }

  // bind input variable
  def bindInput() {
    engine.bind("inputVal", "Int", inputVal)
  }

}

object IMainTest {

  def main(args:Array[String]): Unit = {
    // create an instance
    val evaluator = new Evaluator()

    // first set input value to 3 and do evaluation
    evaluator.setInput(3)
    evaluator.bindInput()
    evaluator.compileScript("def f(x:Int):Int=x+1; println(f(inputVal))")
    evaluator.evalCompiled()

    // let's change input value and re-evaluate
    evaluator.setInput(5)
    evaluator.evalCompiled()

  }
}

我的期望是节目打印出来' 4'和' 6'但结果却是' 4'和' 4'打印出来。

所以,我的问题是......

  1. IMain.bind只是复制值而不是引用引擎引用的某个地方吗?
  2. 每当我想重新分配变量值时,我应该编译吗?
  3. 如果1和2的答案是“是”,那么还有其他方法可以实现我的目的而无需重新绑定和重新编译吗?我只是期望重新分配输入值不需要额外的绑定操作或编译操作。
  4. 我认为很难找到与IMain相关的示例或文档,因此任何参考链接对我来说也可能非常有帮助。谢谢。

0 个答案:

没有答案