Конкретный вопрос, который у меня возникает, заключается в том, как мне создать макрос, который принимает в качестве аргумента функцию с более чем одним параметром, где первый параметр определенного типа предоставляет этот аргумент для этой первой функции.
Макросы (даже процедурные макросы) работают с синтаксическими деревьями, поэтому они не могут изменять свое поведение в зависимости от семантики, включая типы и функции функций. Это означает, что для каждого возможного числа аргументов вам потребуется отдельный макрос. Например:
macro_rules! curry1 {
($func: ident, $($arg: expr),*) => {
|a| $func($($arg),*, a)
}
}
macro_rules! curry2 {
($func: ident, $($arg: expr),*) => {
|a, b| $func($($arg),*, a, b)
}
}
macro_rules! curry3 {
($func: ident, $($arg: expr),*) => {
|a, b, c| $func($($arg),*, a, b, c)
}
}
Что будет использоваться так:
fn f(a: i32, b: i32, c: i32) -> i32 {
a + b + c
}
fn main() {
// requires 2 extra args
let f_2 = curry2!(f, 2);
// requires 1 extra arg
let f_2_1 = curry1!(f, 2, 1);
println!("{}", f(2, 1, 3)); // 6
println!("{}", f_2(1, 3)); // 6
println!("{}", f_2_1(3)); // 6
}