Share
Embed
JavaScript on Scala -Nashorn-
Introduction of Nashorn.
JavaScript runtime on JVM, also on Scala.
petitviolet
May 16, 2016
Transcript
13 slides
-
What is Nashorn? • JavaScript runtime on JVM 㱺 JavaScript
on Scala!!! • Project Nashorn • http://openjdk.java.net/projects/nashorn/ -
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 -
Procedure • Preparation • create ScriptEngine • Compilation • compile
String as a JavaScript function • Execution • feed AnyRef arguments to ScriptEngine -
↑↑↑ʘ(^o^)ʗ↑↑↑ • Store JavaScript functions in DB as Strings •
Use stored functions as Scala function! • Enable replacing algorithms dynamically • e.g. Scoring, Sorting, Selection, … -
↓↓↓ʗ(^o^)ʘ↓↓↓ • Static typing(Scala) <=> Dynamic typing(JS) • lose type
information • Unexpected input causes unexpected output • e.g. null, NaN, Infinity, ReferenceError, … • Cannot avoid such results with compilation • Runtime!!! -
Lose type information? • No • Can use Java types
in JavaScript • Java.Type(“<package.className>”) • 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