Example https://goo.gl/1KrXoo object NashornExample extends App { val ENGINE_NAME = "nashorn" val engine = new ScriptEngineManager() .getEngineByName(ENGINE_NAME) .asInstanceOf[ScriptEngine with Invocable]
val fName = "func" val f = s"function $fName(a, b) { return a + b; };" engine.asInstanceOf[Compilable].compile(f).eval()
val argments = Seq(1, 2) map { _.asInstanceOf[AnyRef] } val result = engine.invokeFunction(fName, argments:_*) println(s"result => $result") }
object NashornExample extends App { val ENGINE_NAME = "nashorn" val engine = new ScriptEngineManager() .getEngineByName(ENGINE_NAME) .asInstanceOf[ScriptEngine with Invocable]
val fName = "func" val f = s"function $fName(a, b) { return a + b; };" engine.asInstanceOf[Compilable].compile(f).eval()
val argments = Seq(1, 2) map { _.asInstanceOf[AnyRef] } val result = engine.invokeFunction(fName, argments:_*) println(s"result => $result") } Preparation Example https://goo.gl/1KrXoo
object NashornExample extends App { val ENGINE_NAME = "nashorn" val engine = new ScriptEngineManager() .getEngineByName(ENGINE_NAME) .asInstanceOf[ScriptEngine with Invocable]
val fName = "func" val f = s"function $fName(a, b) { return a + b; };" engine.asInstanceOf[Compilable].compile(f).eval()
val argments = Seq(1, 2) map { _.asInstanceOf[AnyRef] } val result = engine.invokeFunction(fName, argments:_*) println(s"result => $result") } Compilation Example https://goo.gl/1KrXoo
object NashornExample extends App { val ENGINE_NAME = "nashorn" val engine = new ScriptEngineManager() .getEngineByName(ENGINE_NAME) .asInstanceOf[ScriptEngine with Invocable]
val fName = "func" val f = s"function $fName(a, b) { return a + b; };" engine.asInstanceOf[Compilable].compile(f).eval()
val argments = Seq(1, 2) map { _.asInstanceOf[AnyRef] } val result = engine.invokeFunction(fName, argments:_*) println(s"result => $result") } Execution Example https://goo.gl/1KrXoo
↑↑↑ʘ(^o^)ʗ↑↑↑ • Store JavaScript functions in DB as Strings • Use stored functions as Scala function! • Enable replacing algorithms dynamically • e.g. Scoring, Sorting, Selection, …
Lose type information? • No • Can use Java types in JavaScript • Java.Type(“”) • https://docs.oracle.com/javase/jp/8/docs/technotes/guides/scripting/nashorn/api.html • Enable casting a result of execution • asInstanceOf[T] • https://gist.github.com/petitviolet/4c446066da25c150a0eb50b39b4522d3