Как создать макрос, который принимает функцию с несколькими параметрами и предоставляет первый аргумент для этой функции?

Учитывая:

data=['Elm11', 'Elm12', 'Elm2', 'elm0', 'elm1', 'elm10', 'elm13', 'elm9']

Подобно решению SergO, 1-линейный без внешних библиотек будет:

data.sort(key=lambda x : int(x[3:]))

или

sorted_data=sorted(data, key=lambda x : int(x[3:]))

Объяснение:

Это решение использует функцию функции sort для определения функции, которая будет использоваться для сортировки. Поскольку нам известно, что каждой записи данных предшествует «elm», функция сортировки преобразует в целую часть строки после третьего символа (т. Е. Int (x [3:])). Если числовая часть данных находится в другом месте, то эта часть функции должна измениться.

Приветствия

2
задан Peter Hall 17 January 2019 в 12:25
поделиться

1 ответ

Конкретный вопрос, который у меня возникает, заключается в том, как создать макрос, который принимает в качестве аргумента функцию с более чем одним параметром, где первый параметр определенного типа предоставляет этот аргумент для первого функция.

Макросы (даже процедурные макросы) работают с синтаксическими деревьями, поэтому они не могут изменять свое поведение в зависимости от семантики, включая типы и функции функций. Это означает, что для каждого возможного числа аргументов вам потребуется отдельный макрос. Например:

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
}
0
ответ дан Peter Hall 17 January 2019 в 12:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: