# #后缀 #语法 # #自定义

tilde

使用 ~ 提供 Rust 的语法糖

4 个版本

0.0.4 2019年1月6日
0.0.3 2019年1月5日
0.0.2 2019年1月4日
0.0.1 2019年1月4日

17 in #后缀


用于 tilde_derive

MIT 许可证

12KB
214

目的

这个 tilde 包利用已弃用的波浪号运算符 ~ 为 Rust 程序生成语法糖。

特性

  1. 后缀宏。语法为 first_arg.~the_macro!(rest_args),将被转换成 the_macro!( first_arg, rest_args )。如 简单后缀宏 #2442 所建议,first_arg 将只计算一次。

示例:后缀宏

macro_rules! inc { ($e:expr) => { $e+1 }}

假设 i: i32,库用户可以编写:i.~inc!()i.clone().~inc!() 等,这相当于 inc!( i )inc!( i.clone() ) 的糖。

此功能符合 RFC 2442

macro_rules! log_value {
    ( $self:expr, $msg:expr ) => ({
        $self.1.push_str( &format!( "{}:{}: {}: {:?}", file!(), line!(), $msg, $self.0 ));
        $self
    })
}

fn value<T: std::fmt::Debug>( x: T, log: &mut String ) -> (T,&mut String) {
    log.push_str( &format!( "evaluated {:?}\n", x ));
    ( x, log )
}

tilde! {
    #[test]
    fn rfc_pr_2442() {
        let mut log1 = String::new();
        let mut log2 = String::new();
        ( value( "hello", &mut log1 ).~log_value!( "value" ).0.len(), &mut log2 ).~log_value!( "len" );
        let log = format!( "{}\n{}", log1, log2 );
        assert_eq!( log, r#"evaluated "hello"
tilde_derive/src/lib.rs:72: value: "hello"
tilde_derive/src/lib.rs:72: len: 5"#
        );
    }
}
  1. 后缀函数。语法为 first_arg.~the_fn(rest_args),将被转换成 the_fn!( first_arg, rest_args )

示例:后缀函数

fn inc( i: i32 ) -> i32 { i + 1 }

假设 i: i32,库用户可以编写:i.~inc()i.clone().~inc()等,这相当于inc( i )inc( i.clone() )

将来还将增加更多功能。

许可证

MIT许可证下。

无运行时依赖