Quindi ho il seguente codice macro che sto cercando di eseguire il debug. L'ho preso dallo Rust Book nella sezione "The deep end". Ho rinominato le variabili all'interno della macro per seguire più da vicino il post this.Come si esegue il debug delle macro?
Il mio obiettivo è far stampare al programma ogni riga del programma BCT. Sono ben consapevole che questo è molto pesante per il compilatore.
L'unica rustc errore mi sta dando è:
[email protected]:~/rust/macros$ rustc --pretty expanded src/main.rs -Z unstable-options > src/main.precomp.rs
src/main.rs:151:34: 151:35 error: no rules expected the token `0`
src/main.rs:151 bct!(0, 1, 1, 1, 0, 0, 0; 1, 0);
Quali passi posso prendere per capire dove nella macro il problema è venuta da?
Ecco il mio codice:
fn main() {
{
// "Bitwise Cyclic Tag" automation through macros
macro_rules! bct {
// cmd 0: 0 ... => ...
(0, $($program:tt),* ; $_head:tt)
=> (bct_p!($($program),*, 0 ;));
(0, $($program:tt),* ; $_head:tt, $($tail:tt),*)
=> (bct_p!($($program),*, 0 ; $($tail),*));
// cmd 1x: 1 ... => 1 ... x
(1, $x:tt, $($program:tt),* ; 1)
=> (bct_p!($($program),*, 1, $x ; 1, $x));
(1, $x:tt, $($program:tt),* ; 1, $($tail:tt),*)
=> (bct_p!($($program),*, 1, $x ; 1, $($tail),*, $x));
// cmd 1x: 0 ... => 0 ...
(1, $x:tt, $($program:tt),* ; $($tail:tt),*)
=> (bct_p!($($program),*, 1, $x ; $($tail),*));
// halt on empty data string
($($program:tt),* ;)
=> (());
}
macro_rules! print_bct {
($x:tt ;)
=> (print!("{}", stringify!($x)));
(; $d:tt)
=> (print!("{}", stringify!($d)));
($x:tt, $($program:tt),* ;)
=> {
print!("{}", stringify!($x));
print_bct!($program ;);
};
($x:tt, $($program:tt),* ; $($data:tt),*)
=> {
print!("{}", stringify!($x));
print_bct!($program ; $data);
};
(; $d:tt, $($data:tt),*)
=> {
print!("{}", stringify!($d));
print_bct!(; $data);
};
}
macro_rules! bct_p {
($($program:tt),* ;)
=> {
print_bct!($($program:tt),* ;);
println!("");
bct!($($program),* ;);
};
($($program:tt),* ; $(data:tt),*)
=> {
print_bct!($($program),* ; $($data),*);
println!("");
bct!($($program),* ; $($data),*);
};
}
// the compiler is going to hate me...
bct!(0, 1, 1, 1, 0, 0, 0; 1, 0);
}
Perché il passo della compilazione della macro non si lamenta di '$ (non_al_variabile), *'? In quali situazioni sarebbe valido da solo? Inoltre, non dimenticare di --pretty espanso, igiene, che è utile quando una variabile esterna alla macro ha lo stesso nome di una variabile all'interno della macro (almeno, è così che mi è stata spiegata). – Nashenas
Potrebbe avere senso mangiare un sacco di copie di una cosa esatta, ad es. uno potrebbe togliere gli zero finali con '$ (0), *' che corrisponderebbe solo a '0, 0, 0' (ecc.). Detto questo, sembra relativamente raro che ciò sia estremamente utile. – huon