Как определить макрос, который определяет другой макрос, когда внутренний макрос принимает аргументы? - PullRequest
0 голосов
/ 29 декабря 2018

Минимальный воспроизводимый код:

macro_rules! test {
    ($name:ident: $count:expr) => {
        macro_rules! $name {
            ($($v:expr),*) => {}
        }
    }
}

test!(yo: 123);

Ошибка:

error: attempted to repeat an expression containing no syntax variables matched as repeating at this depth
 --> src/lib.rs:4:15
  |
4 |             ($($v:expr),*) => {}
  |               ^^^^^^^^^

Удаление $count:expr или изменение $count:expr на другой тип, например $count:block, пропускает ошибку, ноМне действительно нужно, чтобы это было expr.Что означает ошибка?

1 Ответ

0 голосов
/ 29 декабря 2018

Это известная проблема (# 35853) .В настоящее время рекомендуется использовать знак доллара $ в качестве отдельного токена.Затем вы можете позвонить себе, передав в $:

macro_rules! test {
    ($name:ident: $count:expr) => { test!($name: $count, $) };

    ($name:ident: $count:expr, $dol:tt) => {
        macro_rules! $name {
            ($dol($v:expr),*) => {}
        }
    };
}

fn main() {
    test!(yo: 2);
    yo!(42);
}
...