minisql/README.md

48 lines
1.3 KiB
Markdown
Raw Permalink Normal View History

2024-12-10 11:04:03 +08:00
# Scala3 编译期代码生成探索
`Scala3` 新增的 `inline` 和 quoted Expression 的可以简化代码生成逻辑。
大部分场景不用在 `macro` 对 Ast 进行复杂模式匹配来分析代码。
## 核心思路 使用 inline 和 `FromExpr` 代替大部分 parsing 工作
`FromExpr``scala3` 内置的 typeclass用来获取编译期值 。
```scala
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` 在编译期获取到值
2024-12-10 11:50:12 +08:00
## 函数解析
2024-12-10 11:04:03 +08:00
`scala` 当前没有对函数进行模式匹配简单方法,所以还是只能通过解析 Ast 来实现,或者如 `slick` 那样通过操作符重载实现
2024-12-10 11:50:12 +08:00
## 待办事项
+ [x] 基础 Ast 及相关操作
+ [x] 验证 `inline``FromExpr` 是否生效
+ [ ] 验证 `lift` / `liftCaseClass` 如何处理
+ [ ] 验证 `Insert/Update` 实现
+ [ ] DSL
- [x] Map
- [ ] Filter/FlatMap/ConcatMap/Union
- [ ] Join
- [ ] GroupBy/Aggeration
+ [ ] 函数解析
- [x] Ident
- [x] Property
- [ ] BinaryOperation
- [ ] UnaryOperation
- [ ] CaseClass
- [ ] Tuple