所以我有我想要调试的以下宏代码。我已经从Rust Book的“深度”一节中看到它。我将宏中的变量重命名为更紧密地遵循this后。如何调试宏?
我的目标是让程序打印出BCT程序的每一行。我很清楚这是非常重要的编译器。
的唯一错误rustc是给我的是:
[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);
我可以采取什么步骤来找出其中的问题是来自宏碁
这里是我的代码:
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);
}
为什么宏编译步骤不会抱怨'$(not_al_variable),*'?在什么情况下,它会自行生效?另外,不要忘记--pretty扩展的卫生,当宏外部的变量与宏内部的变量具有相同的名称(至少,这就是我向他解释的)时,这是很有用的。 – Nashenas
吃一大堆确切的东西可能是有意义的,例如,人们可以用'$(0),*'去掉尾随零,这只会匹配'0,0,0'(等等)。这就是说,这似乎相当罕见,这将是非常有用的。 – huon