История изменений
Исправление Virtuos86, (текущая версия) :
Разобрался, как написать каррирующую функцию. Правда, нужна ночная сборка Раста, потому что атрибут feature
не поддерживается стабильной сборкой, а так ничего:
fn foo(arg: i32, arg1: i32) -> i32 {
arg + arg1
}
#[feature(conservative_impl_trait)]
fn curry_foo(func: fn(i32, i32) -> i32, arg: i32) -> impl Fn(i32) -> i32 {
move |arg1| func(arg, arg1) // без `move' вернуть замыкание низзя!
}
fn main() {
let bar = curry_foo(foo, 1)(2);
println!("{}", c);
}
Пытался написать макрос, который бы генерировал всю цепочку замыканий автоматически, благо для замыканий типы проставлять не нужно, но честно признаюсь, что обосрался победить макросистему. Потому как макрос требуется рекурсивный, и нужно протаскивать каким-то образом через всю цепочку рекурсивных раскрытий все аргументы каррируемой функции: arg1, arg2, ... argN. Протаскивать аргументы не придумалось ничего лучше, кроме как передавая их в самом вызове макроса, но это создает другие проблемы: «unexpected end of macro invocation», то есть неоднозначности при использовании макроса, а именно получается возможная неоднозначность при записи его вызова.
Исходная версия Virtuos86, :
Разобрался, как написать каррирующую функцию. Правда, нужна ночная сборка Раста, потому что атрибут feature
не поддерживается стабильной сборкой, а так ничего:
fn foo(arg: i32, arg1: i32) -> i32 {
arg + arg1
}
#[feature(conservative_impl_trait)]
fn curry_foo(func: fn(i32, i32) -> i32, arg: i32) -> impl Fn(i32) -> i32 {
move |arg1| func(arg, arg1)
}
fn main() {
let bar = curry_foo(foo, 1)(2);
println!("{}", c);
}
Пытался написать макрос, который бы генерировал всю цепочку замыканий автоматически, благо для замыканий типы проставлять не нужно, но честно признаюсь, что обосрался победить макросистему. Потому как макрос требуется рекурсивный, и нужно протаскивать каким-то образом через всю цепочку рекурсивных раскрытий все аргументы каррируемой функции: arg1, arg2, ... argN. Протаскивать аргументы не придумалось ничего лучше, кроме как передавая их в самом вызове макроса, но это создает другие проблемы: «unexpected end of macro invocation», то есть неоднозначности при использовании макроса, а именно получается возможная неоднозначность при записи его вызова.