1个不稳定版本

0.1.0 2020年8月13日

#4#determined


用于 slist

MIT 许可协议

4KB

静态(或栈)列表

Build status Crates.io status Docs

具有静态确定大小的实验性代数列表,它们位于栈上。它们可以迭代、映射、折叠、过滤并具有连续存储。 #![no_std],没有const泛型,没有宏,没有不安全代码,没有堆分配或装箱,没有动态分派,没有依赖,没有使用不稳定代码进行实现。只是Rust特化系统。

列表的构建方式类似于皮亚诺算术中的自然数。例如,具有8个元素的列表类型是

let l: List<T, List<T, List<T, List<T, List<T, List<T, List<T, List<T, ()>>>>>>>>;

当列表被过滤时,结果可以是一个任意的子列表,因此返回的类型是所有小于原始列表的列表的并集

let s: Either<List<T, List<T, List<T, List<T, List<T, List<T, List<T, List<T, ()>>>>>>>>, Either<List<T, List<T, List<T, List<T, List<T, List<T, List<T, ()>>>>>>>, Either<List<T, List<T, List<T, List<T, List<T, List<T, ()>>>>>>, Either<List<T, List<T, List<T, List<T, List<T, ()>>>>>, Either<List<T, List<T, List<T, List<T, ()>>>>, Either<List<T, List<T, List<T, ()>>>, Either<List<T, List<T, ()>>, Either<List<T, ()>, Either<(), Void>>>>>>>>>;

虽然编写起来非常繁琐,但在实际实现中,它具有线性内存效率,并且比原始列表只长一个标签,这是尽可能短的,因为长度仅在运行时确定。这样,就可以在具有可变但有限长度的列表上执行计算。

slist 宏可用于快速创建列表(实际实现中不包含宏)

use slist::prelude::*;

let list = slist![0_usize, 3, 10, 19, 12, 22, 28, 13, 6].map(|i| i + 1);
let filtered = list.filter(|u| (u % 2) == 0);
assert_eq!(filtered + slist![3, 4, 5], slist![4, 20, 14, 3, 4, 5]);
assert_eq!(slist![6, 7] * slist![false, true], slist![(6, false), (7, false), (6, true), (7, true)]);

let mut list = slist![4, 5, 6];
for i in list.as_mut() {
    *i += 2;
}
assert_eq!(list, slist![6, 7, 8]);

请注意,当提供表达式和大小后,slist 宏将单独评估每个元素的表达式。这与数组构造函数(或vec宏)不同,可用于迭代构建有限列表,如从标准输入的数字

use slist::prelude::*;

let stdin = std::io::stdin();
let mut inputs = stdin.lock().lines().filter_map(Result::ok).map(|s| s.parse::<u16>().ok());

let list = slist![inputs.next().flatten(); 4];
let list = list.filter_map(|i| i);

这些宏仅用于方便,对于库的功能不是必需的。例如,前面的代码展开为

let list = {
    use slist::List;
    let list: List<(), List<(), List<(), List<(), List<(), ()>>>>> = Default::default();
    list.map(|_| inputs.next().flatten())
};

如果您喜欢用皮亚诺形式写自然数,则根本不需要任何宏。

不幸的是,在泛型关联类型稳定之前,列表的映射,即从列表引用创建引用列表,需要由单独的特质提供,分别是SlistMap<T, U>,以及SlistAsRef<'a, T>。此crate提供了一个prelude模块,可以从其中方便地导入此类特质。

此crate可能会对编译器造成很大负担,在生产中使用它可能具有一定的风险。

许可证:MIT


lib.rs:

一个过程宏,允许将非负整数n转换为长度为nList类型的slist crate。

无运行时依赖