我的目标是将 Scala 3 代码作为字符串获取,并在运行时将其解析为 Scala 3 的抽象语法树。在此过程中,如果代码存在编译错误,我应该将其作为某些异常的一部分。
更大的目标是如果 scala 代码有效,则最终得到 Expr[T] 并通过拼接正确的位来执行它(我已经介绍了这部分)。
这在 Scala 2.* 中使用 scala-reflect 是可行的here https://stackoverflow.com/questions/57964879/how-to-compile-and-run-scala-code-programmatically.
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()
但据我推测,在 Scala 3 中,scala-reflect 不会被移植。
我怎样才能在 Scala 3 中实现同样的目标?
一些相关链接here https://dotty.epfl.ch/docs/reference/metaprogramming/staging.html and here https://dotty.epfl.ch/docs/reference/metaprogramming/reflection.html
哦,你可以看一下 ammonite: 解析器:https://github.com/com-lihaoyi/Ammonite/blob/master/amm/compiler/src/main/scala-3/ammonite/compiler/Parsers.scala https://github.com/com-lihaoyi/Ammonite/blob/master/amm/compiler/src/main/scala-3/ammonite/compiler/Parsers.scala(他们创建一个虚拟文件并在其上运行编译器)。
如果您不需要评估而只想 AST,那么也许 scalameta [https://scalameta.org/] 就足够了。据我所知,最新版本支持scala3语法,但scalameta本身(即解析树的处理)是在scala2上。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)