| Crates.io | tytro |
| lib.rs | tytro |
| version | 0.1.0 |
| created_at | 2025-06-12 19:44:07.613064+00 |
| updated_at | 2025-06-12 19:44:07.613064+00 |
| description | 类型上的尾递归优化 |
| homepage | |
| repository | https://github.com/zeng-y-l/tytro |
| max_upload_size | |
| id | 1710237 |
| size | 31,069 |
类型上的尾递归优化。
注意:这只是一个实验,不要实际使用。
写一个递归类型(必须用 Self 来递归),加上 #[tytro] 宏,将会自动转换为使用 Vec 的等效实现。例如下面的代码中,List<T> 的内部实现类似 Vec<T>,Nat 的内部实现类似 Vec<()>。
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。
ListF::Cons(1, ListF::Cons(2, ListF::Nil.build()).build()).build()
要匹配递归类型,同样加 F,若要引用则再加 Ref 或 Mut。使用 .get()、.get_ref()、.get_mut() 以获取。
match list.get() {
ListF::Nil => {}
ListF::Cons(x, xs) => {} // xs 的类型是 `List`
}
match list.get_ref() {
ListFRef::Nil => {}
ListFRef::Cons(x, xs) => {} // xs 的类型是 `ListRef`
}
其他具体用法可以看 tests 文件夹。
struct NonEmpty<T>(T, Option<Self>);)derive、warn 等,也不支持文档注释