Macro nar_dev_utils::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]));