Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Scala script in 2.11

I have found an example code for a Scala runtime scripting in answer to Generating a class from string and instantiating it in Scala 2.10, however the code seems to be obsolete for 2.11 - I cannot find any function corresponding to build.setTypeSignature. Even if it worked, the code seems hard to read and follow to me.

How can Scala scripts be compiled and executed in Scala 2.11?

Let us assume I want following:

  • define several variables (names and values)
  • compile script
  • (optional improvement) change variable values
  • execute script

For simplicity consider following example:

I want to define following variables (programmatically, from the code, not from the script text):

val a = 1
val s = "String"

I want a following script to be compiled and on execution a String value "a is 1, s is String" returned from it:

s"a is $a, s is $s"

How should my functions look like?

def setupVariables() = ???

def compile() = ???

def changeVariables() = ???

def execute() : String = ???
like image 503
Suma Avatar asked Mar 25 '26 13:03

Suma


1 Answers

Scala 2.11 adds a JSR-223 scripting engine. It should give you the functionality you are looking for. Just as a reminder, as with all of these sorts of dynamic things, including the example listed in the description above, you will lose type safety. You can see below that the return type is always Object.

Scala REPL Example:

scala> import javax.script.ScriptEngineManager

import javax.script.ScriptEngineManager


scala> val e = new ScriptEngineManager().getEngineByName("scala")

e: javax.script.ScriptEngine = scala.tools.nsc.interpreter.IMain@566776ad


scala> e.put("a", 1)

a: Object = 1


scala> e.put("s", "String")

s: Object = String


scala> e.eval("""s"a is $a, s is $s"""")

res6: Object = a is 1, s is String`

An addition example as an application running under scala 2.11.6:

import javax.script.ScriptEngineManager

object EvalTest{
  def main(args: Array[String]){
   val e = new ScriptEngineManager().getEngineByName("scala")
   e.put("a", 1)
   e.put("s", "String")
   println(e.eval("""s"a is $a, s is $s""""))
  }
}

For this application to work make sure to include the library dependency.

libraryDependencies +=  "org.scala-lang" % "scala-compiler" % scalaVersion.value
like image 174
rock-fall Avatar answered Mar 28 '26 22:03

rock-fall