# tytro
类型上的尾递归优化。
注意:这只是一个实验,不要实际使用。
## 用法
写一个递归类型(必须用 `Self` 来递归),加上 `#[tytro]` 宏,将会自动转换为使用 `Vec` 的等效实现。例如下面的代码中,`List<T>` 的内部实现类似 `Vec<T>`,`Nat` 的内部实现类似 `Vec<()>`。
```rust ignore
use tytro::tytro;
#[tytro]
enum List<T> {
Nil,
Cons(T, Self),
}
#[tytro]
enum Nat {
Z,
S(Self),
}
```
递归类型的引用,不要用 `&'a List<T>`、`&'a mut List<T>`,要用 `ListRef<'a, T>`、`ListMut<'a, T>`。使用 `.as_ref()` 和 `.as_mut()` 以获取。
递归类型如 `List` 本身不能匹配、访问或构造。要构造递归类型,在类型名后加 `F`。如 `List` 则使用 `ListF`。构造后,使用 `.build()` 方法转为原本的类型如 `List`。
```rust ignore
ListF::Cons(1, ListF::Cons(2, ListF::Nil.build()).build()).build()
```
要匹配递归类型,同样加 `F`,若要引用则再加 `Ref` 或 `Mut`。使用 `.get()`、`.get_ref()`、`.get_mut()` 以获取。
```rust ignore
match list.get() {
ListF::Nil => {}
ListF::Cons(x, xs) => {} // xs 的类型是 `List`
}
match list.get_ref() {
ListFRef::Nil => {}
ListFRef::Cons(x, xs) => {} // xs 的类型是 `ListRef`
}
```
其他具体用法可以看 `tests` 文件夹。
## TODO
- 无法对未使用的类型和枚举变体发出警告
- 目前不支持间接递归(如 `struct NonEmpty<T>(T, Option<Self>);`)
- 目前不支持任何属性,包括 `derive`、`warn` 等,也不支持文档注释
- 目前无法在函数或块内使用,需要
- 会为引用和可变引用分别生成类型,代码无法复用
- 目前没有实现任何 trait