E 'possibile scrivere in una macro in ruggine che crea altre macro. Ad esempio, supponiamo che io definisco i seguenti due macro:Macro di ordine superiore
macro_rules! myprint(
($a:expr) => (print!("{}", $a))
)
macro_rules! myprintln(
($a:expr) => (println!("{}", $a))
)
Dal momento che le due macro ripetono un sacco di codice, mi consiglia di scrivere una macro per generare le macro.
Ho provato a generare un tale meta macro.
#![feature(macro_rules)]
macro_rules! metamacro(
($i:ident) => (
macro_rules! $i (
($a:expr) => ({println!("hello {}", $a)})
)
);
)
metamacro!(foo)
fn main() {
foo!(1i);
}
ma ottenere i seguenti errori:
<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.
Edit: Dopo aver suonato in giro con le macro un po ', ho scoperto che un ordine superiore macro funziona come previsto se la macro restituito non lo fa ricevere eventuali argomenti. Ad esempio, il seguente code
#![feature(macro_rules)]
macro_rules! metamacro(
($i:ident) => (
macro_rules! $i (
() => ({println!("hello")})
)
);
)
metamacro!(foo)
fn main() {
foo!();
}
stampe hello
Perché non provare voi stessi? –
Ho provato e non sono riuscito a trovare qualcosa che funzioni. Ho chiesto qui nel caso in cui ci fosse un meccanismo nascosto o meno noto nella ruggine che non avevo ancora provato. Aggiungerò questo alla mia domanda per renderla un po 'più chiara. – mwhittaker
Non hai mostrato cosa hai provato o quali sono gli errori. Questi dettagli sono assolutamente necessari per poter dare qualsiasi tipo di risposta. –