Scala可以用来编写Java应用程序的脚本吗?
我需要从Java加载一段Scala代码,为它设置执行范围(主机应用程序公开的数据),评估它并从中检索结果对象.
Scala文档显示了从Java调用编译的Scala代码是多么容易(因为它变成了常规的JVM字节码).
但是我如何动态评估Scala表达式(从Java或者如果在Scala中更容易)?
对于许多其他语言,有javax.scripting接口.Scala似乎不支持它,我在Java/Scala互操作性文档中找不到任何不依赖于提前编译的东西.
我的目标是将 Scala 3 代码作为字符串获取,并在运行时将其解析为 Scala 3 的抽象语法树。在这个过程中,如果代码有编译错误,我应该把它作为一些异常的一部分。更大的目标是,如果 Scala 代码有效,则以 Expr[T] 结束,并通过拼接正确的位来执行它(我已经介绍了这部分)。
这在 Scala 2.* 中是可行的,在这里使用 scala-reflect 。
val source =
"""
|object HelloWorld {
| def main(args: Array[String]): Unit = {
| println("Hello, world!")
| }
|}
|
|HelloWorld.main(Array())
|""".stripMargin
val tree = toolbox.parse(source)
val binary = toolbox.compile(tree)
binary()
Run Code Online (Sandbox Code Playgroud)
但据我推测,在 Scala 3 中,不会移植 scala-reflect。我如何在 Scala 3 中实现相同的目标?