Следующий код ржавчины не компилируется из-за ошибки макроса
error: local ambiguity: multiple parsing options: built-in NTs stmt ('s') or 1 other option.
макрос A в порядке. Макрос B показывает ошибку.
macro_rules! A {
($x: ident, $($s: stmt)*) => {
println!("hello");
};
}
macro_rules! B {
($x: ident, $($s: stmt)*; $e: expr) => {
println!("hello");
};
}
fn main() {
A![my_name, let x=5];
B![my_name, let x=5; 5];
}
Этот минимальный воспроизводимый пример в B - именно то, что мне нужно. Я хочу, чтобы макрос принимал несколько операторов let и завершался каким-то другим выражением.
Какая неопределенность упоминается?
Есть ли способ обойти это?
Из тех жетонов, которые были приняты после фрагментов выписки, я попробовал несколько комбинаций, но ни один из них, похоже, не имеет значения. Также нельзя поменять оператор на дерево токенов.