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]));