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

Posted

技术标签:

【中文标题】将整个宏输入传递给另一个宏【英文标题】:Pass entire macro input to another macro 【发布时间】:2015-10-28 14:43:09 【问题描述】:

我正在尝试创建一个简单的宏来调用vec!,然后在返回新向量之前进行一些简单的处理:

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

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

【问题讨论】:

【参考方案1】:

您想要的片段说明符是tt(令牌树)。 tt 只是一个任意有效的 rust-token,如关键字或运算符或带有任意 tts 的括号/块/方括号。结合可变参数宏,您可以获得可以直接传递给另一个宏的无限令牌

macro_rules! sorted_vec 
    ($($x:tt)*) => 
        
            let mut v = vec![$($x)*];
            v.sort();
            v
        
    

【讨论】:

我猜这不是“令牌类型”,它是"token tree",但我只是在吹毛求疵,当然:)。 是的,我把manishearth.github.io/rust-internals-docs/syntax/parse/parser/… 和manishearth.github.io/rust-internals-docs/syntax/ast/… 混淆了...

以上是关于将整个宏输入传递给另一个宏的主要内容,如果未能解决你的问题,请参考以下文章

循环通过宏Varargs值

将索引宏传递给已编译的模块

将宏传递给 nmake

处理传递给程序宏的编译时相关文本文件的正确方法

从 rexx 代码向 ispf 宏传递参数时出现无效长度错误

是否可以迭代可变参数宏中的参数?