生鏽是否有可能編寫一個創建其他宏的宏。例如,假設我定義了以下兩個宏:高階宏指令
macro_rules! myprint(
($a:expr) => (print!("{}", $a))
)
macro_rules! myprintln(
($a:expr) => (println!("{}", $a))
)
由於兩個宏重複大量的代碼,我可能要編寫一個宏來產生宏。
我試圖產生這樣的meta macro。
#![feature(macro_rules)]
macro_rules! metamacro(
($i:ident) => (
macro_rules! $i (
($a:expr) => ({println!("hello {}", $a)})
)
);
)
metamacro!(foo)
fn main() {
foo!(1i);
}
,但得到以下錯誤:
<anon>:6:13: 6:14 error: unknown macro variable `a`
<anon>:6 ($a:expr) => ({println!("hello {}", $a)})
^
playpen: application terminated with error code 101
Program ended.
編輯:與宏多一些玩耍後,我發現,如果返回的宏不按預期高階宏的工作方式接收任何參數。例如,下面的code
#![feature(macro_rules)]
macro_rules! metamacro(
($i:ident) => (
macro_rules! $i (
() => ({println!("hello")})
)
);
)
metamacro!(foo)
fn main() {
foo!();
}
打印hello
爲什麼不試試自己嗎? –
我試過了,沒有找到有效的東西。我在這裏問過,如果有一個我還沒有嘗試過的隱藏或較少已知的鏽蝕機制。我將這個添加到我的問題中,使其更清楚一點。 – mwhittaker
你沒有顯示你嘗試過什麼或錯誤是什麼。這些細節對於給出任何答案都是絕對必要的。 –