Rust 如何使宏在生锈之前进行扩展?

Rust 如何使宏在生锈之前进行扩展?,rust,rust-macros,rust-decl-macros,Rust,Rust Macros,Rust Decl Macros,我正试图只用宏在Rust中写一个quine。 为了做到这一点,我将main函数嵌入宏f1,并尝试在f2中嵌入f1的文本表示法stringify 以下是我目前的代码: macro_rules!f1{()=>(fn main(){println!("macro_rules!{}\nmacro_rules!f2{{($x:expr)=>(stringify!($x))}}\nf1!();",f2!(f1));})} macro_rules!f2{($x:expr)=>(stringi

我正试图只用宏在Rust中写一个quine。 为了做到这一点,我将
main
函数嵌入宏
f1
,并尝试在
f2
中嵌入
f1
的文本表示法
stringify

以下是我目前的代码:

macro_rules!f1{()=>(fn main(){println!("macro_rules!{}\nmacro_rules!f2{{($x:expr)=>(stringify!($x))}}\nf1!();",f2!(f1));})}
macro_rules!f2{($x:expr)=>(stringify!($x))}
f1!();
毫不奇怪,结果是:

macro_rules!f1
macro_rules!f2{($x:expr)=>(stringify!($x))}
f1!();

我需要的是
f1
在字符串化之前进行扩展,以便程序成为quine。我该怎么做?

你不能控制扩张的顺序。IIRC,有人曾经根据多少<代码>提出了一种语法您使用的,即
!!x在
之前得到解析!f2
,但这个想法没有得到太多支持。我喜欢你的基于宏的想法,奎因:顺便说一句:)我明白了,那太不幸了!我设法做到了,但没有严格化!,很遗憾,它很难阅读。@JonNimrod请您提供解决此问题的解决方案,该解决方案已记录在案,可用于其他处于相同情况的人?