macro_rules! cartesian { (@[$(($a1:tt, $a2:tt))*] [] $b:tt $init_b:tt $submacro:tt) => { ... }; (@$out:tt [$a:tt, $($at:tt)*] [] $init_b:tt $submacro:tt) => { ... }; (@[$($out:tt)*] [$a:tt, $($at:tt)*] [$b:tt, $($bt:tt)*] $init_b:tt $submacro:tt) => { ... }; (@diag[$($start_a:tt),*], [$mid_a:tt, $($end_a:tt),*], [$($start_b:tt),*], [$mid_b:tt, $($end_b:tt),*], $lower:tt, $diag:tt, $upper:tt) => { ... }; (@diag[$($start_a:tt),*], [$last_a:tt], [$($start_b:tt),*], [$last_b:tt], $lower:tt, $diag:tt, $upper:tt) => { ... }; ([$($a:tt)*], [$($b:tt)*], $submacro:tt) => { ... }; ([$($a:tt)*], $submacro:tt) => { ... }; ([$($a:tt)*], [$($b:tt)*], $lower:tt, $diag:tt, $upper:tt) => { ... }; ([$($a:tt)*], $lower:tt, $diag:tt, $upper:tt) => { ... }; }