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