#notation #macro #do #mdo #hado

comp

纯宏Do表示法和Option、Result和Iterator的列表解析

1个不稳定版本

使用旧的Rust 2015

0.2.1 2017年5月27日
0.1.3 2017年2月19日
0.1.2 2017年2月19日

#1347 in Rust模式

MIT/Apache

27KB
458

comp-rs

Build Status crates.io docs.rs

comp-rs提供了纯宏Do表示法和Option、Result和Iterator的列表解析。

它提供了语法扩展,可以轻松组合包装类型(OptionResultIterator),这类似于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

IteratorOption不同,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-MIThttp://opensource.org/licenses/MIT

没有运行时依赖