No description
Find a file
2024-12-10 11:04:03 +08:00
project save 2024-11-14 19:46:36 +08:00
src/main/scala/minisql add README file 2024-12-10 11:04:03 +08:00
.gitignore save 2024-11-14 19:46:36 +08:00
.scalafmt.conf rename 2024-11-05 17:17:59 +08:00
build.sbt rename 2024-11-05 17:17:59 +08:00
README.md add README file 2024-12-10 11:04:03 +08:00

Scala3 编译期代码生成探索

Scala3 新增的 inline 和 quoted Expression 的可以简化代码生成逻辑。

大部分场景不用在 macro 对 Ast 进行复杂模式匹配来分析代码。

核心思路 使用 inline 和 FromExpr 代替大部分 parsing 工作

FromExprscala3 内置的 typeclass用来获取编译期值 。

inline def compile(inline x: Dsl): Option[String] = ${ compileImpl('x) }

private def compileImpl(x: Expr[Dsl])(using Quotes): Expr[Option[String]] = {
  import quotes.reflect.*
  x.value match {
    case Some(xv) => '{ Some(${ Expr(xv.ast.toString()) }) }
    case None     => '{ None }
  }
}

如上述代码所示,只要提供 FromExpr[Dsl] 就可以通过 x.value 在编译期获取到值

Function parsing

scala 当前没有对函数进行模式匹配简单方法,所以还是只能通过解析 Ast 来实现,或者如 slick 那样通过操作符重载实现