2个版本

0.1.1 2020年9月24日
0.1.0 2020年9月24日

#6 in #translates


type-vec 中使用

MIT 许可证

135KB
3.5K SLoC

TYP:Rust中的类型级编程

[书籍 | 文档]

TYP使您能够使用Rust语法编写类型运算符,即转换类型的函数。

它是willcrichton/Tyrade的重构,并受到jerry73204/type-freak的启发。

特性

Rust语法

TYP采用类似于Rust的语法,其中值成为类型,而类型成为特质的边界。其核心概念是类型运算符,它是一个接受类型参数并产生类型的函数。输入和输出类型可以可选地添加特质边界。

fn TypeOperatorName<generic1, generic2>(type1: _, type2: Trait1 + Trait2) -> TraitBound { ... }
  • <generic1, generic2> 列出了帮助区分公共类型的泛型标识符。
  • type1type2 是由泛型和公共类型组成的输入类型。
  • type1: _ 表示该类型没有特质边界。
  • 输出特质边界 fn() -> TraitBound 是可选的。

以下代码片段演示了一个简单的类型运算符。

typ! {
    use typenum::Unsigned;

    fn Add<lhs, rhs>(lhs: Unsigned, rhs: Unsigned) -> Unsigned {
        lhs + rhs
    }
}

内置的typenum支持

TYP为typenum提供了一等支持。整数字面量被转换为typenum类型。以下字面量被TYP所理解。

  • 有符号整数:77i
  • 无符号整数:7u
  • 位:truefalse

常见的二进制和一元运算符适用于具有适当特质的类型。例如,A + B 扩展为 <A as Add<B>>::Output

typ! {
    use typenum::{Integer, Bit};

    fn IsOdd<value>(value: Integer) -> Bit {
        if value % 2 == 1 {
            true
        } else {
            false
        }
    }
}

类型匹配

与普通的 Rust 一样,match 语法允许您匹配和展开类型。您可以使用 #[generics(...)] 属性在模式上绑定新的泛型。

示例演示了一个类型运算符,该运算符在类型级别列表的末尾追加一个类型。这是通过递归地将列表展开到 Cons 节点和 Nil 列表末尾标记来完成的。

pub trait List {}

pub struct Cons<Head, Tail: List> { /* omit */ }
impl<Head, Tail: List> List for Cons<Head, Tail> {}

pub struct Nil;
impl List for Nil {}

typ! {
    fn Append<input, value>(input: List, value: _) -> List {
        match input {
            #[generics(head, tail: List)]
            Cons::<head, tail> => {
                let new_tail = Append(tail, value);
                Cons::<head, new_tail>
            }
            Nil => {
                Cons::<value, Nil>
            }
        }
    }
}

示例

更高级的示例可以在 tests/ 目录中找到。

许可证

MIT 许可证。请参阅 LICENSE.txt

依赖项

~3MB
~62K SLoC