将整个宏输入传递给另一个宏

6

我正在尝试制作一个简单的宏,该宏将使用收到的任何内容调用vec!,然后在返回新向量之前进行一些简单的处理:

macro_rules! sorted_vec {
    ($x:expr) => {
        {
            let v = vec![$x];
            v.sort();
            v
        }
    }
}

问题在于我的宏试图分析语法,因此会抱怨逗号等。这是有道理的,但我不确定该如何解决它。我认为expr不是要使用的正确片段说明符。如何才能将原始输入传递给 vec!而不处理它呢?
1个回答

9
你需要的片段说明符是 tt(Token-Tree)。tt 只是一个任意有效的 Rust Token,例如关键字、运算符或者带有任意 tt 的括号/块/方括号。结合可变参数宏,你可以获得无限的 Token,这些 Token 可以直接传递给另一个宏。
macro_rules! sorted_vec {
    ($($x:tt)*) => {
        {
            let mut v = vec![$($x)*];
            v.sort();
            v
        }
    }
}

1
我猜这里不是“token type”,而是“token tree”(https://github.com/rust-lang/rust/blob/master/src/libsyntax/ext/tt/macro_parser.rs#L509),但当然这只是我挑剔而已 :)。 - Vladimir Matveev
是的,我把 http://manishearth.github.io/rust-internals-docs/syntax/parse/parser/enum.TokenType.html 和 http://manishearth.github.io/rust-internals-docs/syntax/ast/enum.TokenTree.html 搞混了... - oli_obk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接