No description
Find a file
2024-12-13 19:32:09 +08:00
project save 2024-11-14 19:46:36 +08:00
src/main/scala/minisql test no macro parsing 2024-12-13 19:32:09 +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 upgrade scala version 2024-12-13 16:15:34 +08:00
README.md 增加文档 2024-12-10 11:50:12 +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 在编译期获取到值

函数解析

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

待办事项

  • 基础 Ast 及相关操作
  • 验证 inlineFromExpr 是否生效
  • 验证 lift / liftCaseClass 如何处理
  • 验证 Insert/Update 实现
  • DSL
    • Map
    • Filter/FlatMap/ConcatMap/Union
    • Join
    • GroupBy/Aggeration
  • 函数解析
    • Ident
    • Property
    • BinaryOperation
    • UnaryOperation
    • CaseClass
    • Tuple