better_eq/
lib.rs

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}