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

and*_*man 3 rust rust-macros rust-decl-macros

我正在尝试创建一个简单的宏,vec!无论它接收到什么都会调用,然后在返回新向量之前执行一些简单的处理:

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

问题是我的宏试图解析语法,所以它抱怨逗号等等.这是有道理的,但我不知道如何解决它.我认为不是expr正确的片段说明符.如何在vec!不进行处理的情况下将原始输入传递给它?

oli*_*obk 5

您想要的片段说明符是tt(令牌树).A tt只是一个任意有效的锈色标记,如关键字或操作符或括号/块/方括号tt内部任意s.结合可变参数宏,您将获得可以直接传递给另一个宏的无限令牌

macro_rules! sorted_vec {
    ($($x:tt)*) => {
        {
            let mut v = vec![$($x)*];
            v.sort();
            v
        }
    }
}
Run Code Online (Sandbox Code Playgroud)