Czy w rdzeniu jest możliwe napisanie makra, które tworzy inne makra. Na przykład, załóżmy zdefiniować następujące dwa makra:Makra wyższego rzędu
macro_rules! myprint(
($a:expr) => (print!("{}", $a))
)
macro_rules! myprintln(
($a:expr) => (println!("{}", $a))
)
Ponieważ dwa makra powtórzyć dużo kodu, może chcę napisać makro do generowania makr.
Próbowałem wygenerować taki meta macro.
#![feature(macro_rules)]
macro_rules! metamacro(
($i:ident) => (
macro_rules! $i (
($a:expr) => ({println!("hello {}", $a)})
)
);
)
metamacro!(foo)
fn main() {
foo!(1i);
}
ale uzyskać następujące błędy:
<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: Po zabawy z makrami trochę więcej, odkryłem, że wyższego rzędu prac makro zgodnie z oczekiwaniami, jeśli nie wrócił makro odbierać jakiekolwiek argumenty. Na przykład, następujący code
#![feature(macro_rules)]
macro_rules! metamacro(
($i:ident) => (
macro_rules! $i (
() => ({println!("hello")})
)
);
)
metamacro!(foo)
fn main() {
foo!();
}
wydruki hello
Dlaczego nie spróbować samemu? –
Próbowałem i nie udało mi się znaleźć czegoś, co działa. Zapytałem tutaj, na wypadek, gdyby istniał ukryty lub mniej znany mechanizm rdzy, którego jeszcze nie próbowałem. Dodam to do mojego pytania, aby było trochę jaśniej. – mwhittaker
Nie pokazałeś, co próbowałeś lub jakie są błędy. Te dane są absolutnie niezbędne, aby móc udzielić jakiejkolwiek odpowiedzi. –