1个不稳定版本
使用旧的Rust 2015
0.2.1 | 2017年5月27日 |
---|---|
0.1.3 |
|
0.1.2 |
|
#1347 in Rust模式
27KB
458 行
comp-rs
comp-rs提供了纯宏Do表示法和Option、Result和Iterator的列表解析。
它提供了语法扩展,可以轻松组合包装类型(Option
、Result
和Iterator
),这类似于scala中的for-comprehension
或haskell中的Do notation
。
文档
用法
首先,将以下内容添加到您的Cargo.toml
[dependencies]
comp = "0.1"
然后,将此内容添加到您的crate根目录
#[macro_use]
extern crate comp;
示例
comp-rs
提供三个宏:option!
、result!
和iter!
,将arrow(<-)
语句转换为FP绑定(flat_map
)。
迭代器
#[macro_use]
extern crate comp;
let iter = iter! {
let x <- 0..2u8;
let y <- vec!['a', 'b'];
(x, y)
};
for x in iter {
println!("{:?}", x);
}
// Print (0, 'a') (0, 'b') (1, 'a') (1, 'b')
Option
#[macro_use]
extern crate comp;
let option = option! {
let a <- Some(1);
let b <- Some(2);
a + b
};
assert_eq!(option, Some(3));
Result
与Iterator
和Option
不同,rust提供问号语法来组合Result
。
让我们看看comp-rs
是如何使其更加明确和具有表达力的。
本地方式
#[macro_use]
extern crate comp;
use std::fs::File;
use std::io;
use std::io::prelude::*;
// try!() macro must be wrap into a function
fn content() -> io::Result<String> {
let mut f = try!(File::open("foo.txt"));
let mut s = String::new();
try!(f.read_to_string(&mut s));
Ok(s)
}
问号
#[macro_use]
extern crate comp;
use std::fs::File;
use std::io;
use std::io::prelude::*;
// '?' mark must be wrap into a function
fn content() -> io::Result<String> {
let mut f = File::open("foo.txt")?;
let mut s = String::new();
f.read_to_string(&mut s)?;
Ok(s)
}
result!
方式
#[macro_use]
extern crate comp;
use std::fs::File;
use std::io;
use std::io::prelude::*;
let content: io::Result<String> = result! {
let mut f <- File::open("foo.txt");
let mut s = String::new();
let _ <- f.read_to_string(&mut s);
s
};
贡献
欢迎各种贡献。
- 问题 当您发现错别字、错误或有任何问题时,请随时提出问题。
- 拉取请求。更好的实现、更多测试、更多文档和错别字修复都欢迎。
许可证
在MIT许可证下许可(LICENSE-MIT或http://opensource.org/licenses/MIT)