tytro

Crates.iotytro
lib.rstytro
version0.1.0
created_at2025-06-12 19:44:07.613064+00
updated_at2025-06-12 19:44:07.613064+00
description类型上的尾递归优化
homepage
repositoryhttps://github.com/zeng-y-l/tytro
max_upload_size
id1710237
size31,069
(zeng-y-l)

documentation

README

tytro

类型上的尾递归优化。

注意:这只是一个实验,不要实际使用。

用法

写一个递归类型(必须用 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,若要引用则再加 RefMut。使用 .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 文件夹。

TODO

  • 无法对未使用的类型和枚举变体发出警告
  • 目前不支持间接递归(如 struct NonEmpty<T>(T, Option<Self>);
  • 目前不支持任何属性,包括 derivewarn 等,也不支持文档注释
  • 目前无法在函数或块内使用,需要
  • 会为引用和可变引用分别生成类型,代码无法复用
  • 目前没有实现任何 trait
Commit count: 1

cargo fmt