Как уменьшить количество правил, определяющих функции внутри `macro_rules!`?

Мне нужно создать макроправила, расширяющиеся следующим образом:

define_fn!(fn a());
// expands to
fn a() {}
define_fn!(pub fn a());
// expands to
pub fn a() {}
define_fn!(fn a(arg1: u32,));
// expands to
fn a(arg1: u32) {}
define_fn!(pub fn a(arg1: u32, arg2: i32));
// expands to
pub fn a(arg1: u32, arg2: i32) {}

Я мог бы легко сделать это, используя 4 правила, но я хочу сделать это в 1 правиле, т.е.

macro_rules! define_fn {
    (<some magic>) => { <some other magic> };
}

Как это сделать в 1 правиле? Возможно ли это вообще?

это работает? Я предполагаю, что отсутствующая запятая после макроса в третьем примере не имеет значения.

true equals false 24.08.2024 15:41
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
1
1
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В небольшой книге макросов Rust есть страница, на которой показано, как анализировать функцию. После этой страницы это должно делать то, что вы хотите:

macro_rules! define_fn {
    ($v:vis fn $name:ident ($($i:ident : $t:ty),*)) => { 
        $v fn $name ($($i: $t),*) {}
    };
}

Детская площадка

спс за исправление ответа. Я решил проблему с аргументами (я посмотрел определение println!, и по какой-то причине там было 2 правила, и из-за этого меня заблокировали в этой части), но застрял на необязательном pub. Я не знал, что vis по умолчанию необязателен

return 26.08.2024 17:32

Другие вопросы по теме