minisql/README.md
2024-12-18 16:09:08 +08:00

47 lines
1.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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` 在编译期获取到值
## 函数解析
`scala` 当前没有对函数进行模式匹配简单方法,所以还是只能通过解析 Ast 来实现,或者如 `slick` 那样通过操作符重载实现
## 待办事项
+ [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