#[macro_export]
macro_rules! inspect {
($prefix:expr => $expr:expr) => {{
let val = $expr;
println!("{}:{} - {}{:?}", file!(), line!(), $prefix, val);
val
}};
($expr:expr) => {
inspect!(concat!(stringify!($expr), " = ") => $expr)
};
($prefix:expr => $($expr:expr),+) => {
inspect!($prefix => ($($expr),+))
};
($($expr:expr),+) => {
inspect!(($($expr),+))
};
}
#[test]
fn test_inspect() {
assert_eq!(inspect!("foo"), "foo");
assert_eq!(inspect!("" => "foo"), "foo");
assert_eq!(inspect!(1 + 2, 2 + 3, 3 + 4), (3, 5, 7));
assert_eq!(inspect!("" => 1 + 2, 2 + 3, 3 + 4), (3, 5, 7));
fn fib(n: u64) -> u64 {
inspect!("fib :: n = " => n);
inspect! { "ret = " => match n {
0 | 1 => n,
n => fib(n-1) + fib(n-2)
}}
}
fn fib_iter(n: u64) -> u64 {
inspect!("fib_iter :: n = " => n);
let (mut a, mut b) = (0, 1);
for _ in 0..n {
inspect!(a, b);
let tmp = b;
b += a;
a = tmp;
}
inspect!("ret = " => a)
}
assert_eq!(fib(4), 3);
assert_eq!(fib_iter(7), 13);
}