#macro #utility-macro #utility #derive-debug #debugging #simplification

macro no-std multicall

简化对单个对象进行多次操作或调用的宏

4 个版本

0.1.4 2023年5月14日
0.1.3 2023年1月28日
0.1.2 2023年1月27日
0.1.1 2023年1月27日
0.1.0 2023年1月27日

#19 in #utility-macro


spl 中使用

MIT 许可证

12KB
172

多调用

此库提供了 multicall! 宏,允许您对单个对象应用多个操作,而无需再次写入对象名称。

语法

let mut test_variable = 1;
multicall! {
    expr:
    operation;
    set test_variable = operation;
    exec normal_operation(#);
    operation;
    ...
    {
        subexpr:
        operation;
        set test_variable += operation;
        exec normal_operation(#);
        operation;
        ...
    }; // this semicolon is mandatory.
}

求值结果为

let mut test_variable = 1;
{
    let __multicall_item__ = expr;
    __multicall_item__.operation;
    test_variable = __multicall_item__.operation;
    normal_operation(__multicall_item__);
    __multicall_item__.operation;
    ...
    {
        let __multicall_item__ = __multicall_item__.subexpr;
        __multicall_item__.operation;
        test_variable += __multicall_item__.operation;
        normal_operation(__multicall_item__);
        __multicall_item__.operation;
        ...
    };
}

示例

use multicall::multicall;
use std::ops::AddAssign;
#[derive(Debug)]
struct Test { a: u32, b: i32 }

fn main() {
    let mut test = Test { a: 0, b: 0 };
    let b_plus_five;
    multicall! {
        &mut test:
        a = 5;
        b = 6;
        {
            b:
            add_assign(500);
        };
        {
            a:
            add_assign(58);
        };
        a.add_assign(100 - 58);
        set b_plus_five = b + 5;
        exec println!("{}, {}", #.a, #.b);
    }
    println!("{test:?}");
}

更多示例在 examples/.

路线图

  • 基本多调用语法
  • set 外部变量
  • exec 正常代码
  • if 语句
  • ... 可能更多

无运行时依赖