订购宏参数执行

Dan*_*ath 4 macros rust

我正在使用一个用于字符串实习(字符串缓存)的库,它使用宏来高效地创建元素(atom!).然而,为了简化,这里是一个类似的宏来演示这个问题

macro_rules! string_intern {
   ("d") => ("Found D");
}
Run Code Online (Sandbox Code Playgroud)

说我需要从另一个宏调用这个宏并给它一个标识符的字符串版本.

macro_rules! print_ident {
    ($id:ident) => (
        string_intern!(stringify!($id));
    );
}
Run Code Online (Sandbox Code Playgroud)

但是调用这个宏

fn main() {
    print_ident!(d);
}
Run Code Online (Sandbox Code Playgroud)

失败错误:

error: no rules expected the token `stringify`
 --> <anon>:7:24
  |
7 |         string_intern!(stringify!($id));
  |                        ^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

游乐场链接

我知道stringify!正确地将标识符转换为d字符串"d",因为它println!可以按预期工作.有没有办法将我想要的标识符传递给字符串string_intern

DK.*_*DK. 9

println!允许你这样做,因为它使用format_args!了封面,这是一个编译器提供的"内在",使用它之前强制评估它的第一个参数.您无法从用户定义的宏执行此操作; 你必须编写一个编译器插件(需要夜间编译器,不能保证稳定性).

是的; 你不能.抱歉.您唯一能做的就是重新定义宏,使您不需要实际的字符串文字,或更改调用它的方式.