関数のような手続き型マクロを作成しました。宣言型マクロをパラメーターとして呼び出します。手続き型マクロを処理する前に宣言型マクロを展開する(または手続き型マクロ内で展開する)方法を見つけたいと思っていました。例 (コードはhttps://github.com/Jasperav/rec_macroでも入手できます):
電話サイト:
macro_rules! t {
($e:expr) => {
$e.to_string() + " I am a macro"
}
}
fn main() {
re!(t!("hi"));
}
Proc マクロ クレート:
#[proc_macro_hack]
pub fn re(input: TokenStream) -> TokenStream {
panic!("{:#?}", input) // I can see "hi" and something like t!, but not the result of the macro expansion
}
メッセージ内に、宣言型マクロ ( ) が含まれpanic
ていることがわかります。この場合(または何らかのタイプ)t
の生の値が必要です。私の場合、宣言型マクロは常にまたはに展開する必要があります。hi I am a macro
syn
&str
String
t
を呼び出す前に展開することre
、またはt
proc マクロ内で手動で展開することは可能ですか? マクロのような機能を備えた proc 内で、マクロの結果 (この場合は「こんにちは、私はマクロです」) を確認したいと考えています。
ありがとう。