1#![feature(macro_metavar_expr)]
2
3#[macro_export]
4macro_rules! with_better_eq {($($body:tt)*) => ({
5 macro_rules! inner {
6 ([$$($$buffer:tt)*] { $$($$inner:tt)* } $$($$tail:tt)*) => (inner!(
7 [$$($$buffer)* { with_better_eq!($$($$inner)*) }] $$($$tail)*
8 ));
9 ([$$($$buffer:tt)*] ( $$($$inner:tt)* ) $$($$tail:tt)*) => (inner!(
10 [$$($$buffer)* ( with_better_eq!($$($$inner)*) )] $$($$tail)*
11 ));
12 ([$$($$buffer:tt)*] [ $$($$inner:tt)* ] $$($$tail:tt)*) => (inner!(
13 [$$($$buffer)* [ with_better_eq!($$($$inner)*) ]] $$($$tail)*
14 ));
15 ([$$($$buffer:tt)*] == $$($$tail:tt)*) => (inner!(
16 @eq [$$($$buffer)* ==] $$($$tail)*
17 ));
18 ([$$($$buffer:tt)*] $$tt:tt $$($$tail:tt)*) => (inner!(
19 [$$($$buffer)* $$tt] $$($$tail)*
20 ));
21 (@eq [$$($$buffer:tt)*] == $$($$tail:tt)*) => (inner!(
22 @eq [$$($$buffer)*] $$($$tail)*
23 ));
24 (@eq [$$($$buffer:tt)*] = $$($$tail:tt)*) => (inner!(
25 @eq [$$($$buffer)*] $$($$tail)*
26 ));
27 (@eq [$$($$buffer:tt)*] $$tt:tt $$($$tail:tt)*) => (inner!(
28 [$$($$buffer)* $$tt] $$($$tail)*
29 ));
30 ([$$($$buffer:tt)*]) => ({ $$($$buffer)* });
31 }
32
33 inner!([] $($body)*)
34})}
35
36#[test]
37#[cfg(test)]
38fn it_works() {
39 with_better_eq! {
40 assert!(1 ========= 1);
41 }
42}