scala作为脚本语言

时间:2011-05-28 20:19:17

标签: scala scripting classloader interpreter runtime-compilation

  

可能重复:
  “eval” in Scala

我知道scala是一种编译语言,但我也知道我可以动态地将类加载到jvm中,我可以在运行时调用scala编译器,但最重要的是我也有一个很棒的repl,所以有scala作为一种脚本语言应该是可能的。

所以我需要运行一些任务:

简单解释:

val src = """ println("Hello World") """
interpret(src)

调用外部函数:

object A{
    def foo = 
        println("Hello World")
}

val src = """ A.foo """
interpret(src)

实施功能:

trait T{
    def foo:String
}

val src = """ class A extends T{ def foo = "Hello World" } """
interpret(src)
val t = loadClassAndCreatInstance.asInstanceOf[T]
println(t.foo)

为我的所有问题找到解决方案会很棒。

2 个答案:

答案 0 :(得分:4)

不知怎的,我已经发现如何使用scala作为脚本语言,但我仍然遇到classLoader的问题

object O{
  def foo = println("Hello World in object O")
}

trait T{
  def foo:String
}

object MyInterpreter extends App{
  val srcA = 
  """ 
  println("Hello World from srcA") 
  """

  val srcB = """ O.foo """

  val srcC = """ 
  class A extends T{ 
    def foo = "Hello World from srcC"
    override def toString = "this is A in a src"
  }
  """


  val out = System.out
  val flusher = new java.io.PrintWriter(out)

  val interpreter = {
  val settings = new import scala.tools.nsc.GenericRunnerSettings( println _ )
  new scala.tools.nsc.interpreter.IMain(settings, flusher)
  }

  interpreter.interpret(srcA)
  interpreter.interpret(srcB)
  interpreter.compileString(srcC)

  val classA = interpreter.classLoader.findClass("A")

  println(classA)

  val constructors = classA.getDeclaredConstructors
  val myinstance = constructors(0).newInstance()

  println(myinstance)

  //this still throws an classCastException
  myinstance.asInstanceOf[T].foo 
  //but everything else works
}

答案 1 :(得分:1)

请在此处查看我的回答:"eval" in Scala

(我假设您已经了解scala交互模式,以及如何使用与Scala兼容的shebang #!行编写可执行脚本。)