f_parallel

Macro f_parallel 

Source
macro_rules! f_parallel {
    [
        // 要被调用的函数(标识符)
        $($($path:ident).+ $(,)?)*;
        // 参数的表达式序列 // ! ↓此处必须限制为「+」,不然无法实现「尾后分号」(会引发解析歧义)
        $($parameters:tt)*
    ] => { ... };
    [
        @dispatch
        // 要被调用的函数(标识符)
        { $( $f:tt )* }
        // 参数的表达式序列 // ! ↓此处必须限制为「+」,不然无法实现「尾后分号」(会引发解析歧义)
        $parameters:tt
    ] => { ... };
    [
        @dispatch_f
        // 要被调用的函数(标识符)
        [ $($path:ident).+ ];
        // 参数的表达式序列 // ! ↓此处必须限制为「+」,不然无法实现「尾后分号」(会引发解析歧义)
        { $( $( $arg:expr $(,)? )+ );* $(;)? }
    ] => { ... };
    [
        @inner
        // 要被调用的函数(标识符)
        $f:tt
        // 参数的表达式序列的序列
        $( [ $($arg:expr,)* ] )*
    ] => { ... };
    [
        @inner_expand
        // 要被调用的函数(标识符)
        [ $($f:tt)* ]
        // 参数的表达式序列
        [ $($arg:expr,)* ]
    ] => { ... };
}
Expand description

平行将参数填充进函数

  • ✨允许「一个函数多列参数」也允许「多个函数一列函数」
  • 📄形式
    • f_parallel![add3; 1 2 3; 4 5 6] => [add3(1, 2, 3), add3(4, 5, 6)]
    • f_parallel![add3 mul3; 1 2 3] => (add3(1, 2, 3), mul3(1, 2, 3))

§Example

use nar_dev_utils::f_parallel;
fn add3(a: i32, b: i32, c: i32) -> i32 {
    a + b + c
}
let m = f_parallel![
    add3;
    1 2 3; // add3(1, 2, 3)
    4 5 6; // add3(4, 5, 6)
    7, (8) 9; // add3(7, 8, 9) // ! 📌此处使用逗号避免「调用歧义」`7(8)`
];
fn mul3(a: i32, b: i32, c: i32) -> i32 {
    a * b * c
}
assert_eq!(m, [6, 15, 24]); // 因为只分派了一个函数,故结果 `([6, 15, 24])` 无需作为元组存储
let m = f_parallel![
    add3 mul3; // * 📌此处基于两个函数在最外层分派,参数以元组形式存储(中间逗号可选)
    1 2 3; // [add3(1, 2, 3), add3(4, 5, 6)]
    4 5 6; // [mul3(1, 2, 3), mul3(4, 5, 6)]
];
assert_eq!(m, ([6, 15], [6, 120]));