LINUX.ORG.RU

История изменений

Исправление 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», то есть неоднозначности при использовании макроса, а именно получается возможная неоднозначность при записи его вызова.