terms 0.1.3

Tree terms and patterns data structures
Documentation
#[macro_export]
macro_rules! term {
    ( $f:tt ( $( $sub:tt )+ ) ) => {
        {
            let mut subs = Vec::new();
            sub_terms!(subs $($sub)+);
            Term::new($f.clone(), subs)
        }
    };
    ( $f:tt () ) => {
        {
            Term::new($f.clone(), Vec::new())
        }
    };
    ( $f:tt ) => {
        {
            Term::new($f.clone(), Vec::new())
        }
    }
}

#[macro_export]
macro_rules! sub_terms {
    ( $subs:ident $f:tt ( $( $sub:tt )* ), $( $tail:tt )+ ) => {
        $subs.push(term!($f ($($sub)*)));
        sub_terms!($subs $($tail)*);
    };
    ( $subs:ident $f:tt ( $( $sub:tt )* ), ) => {
        $subs.push(term!($f ($($sub)*)));
    };
    ( $subs:ident $f:tt ( $( $sub:tt )* ) ) => {
        $subs.push(term!($f ($($sub)*)));
    };
    ( $subs:ident $f:tt, $( $tail:tt )+ ) => {
        $subs.push(term!($f));
        sub_terms!($subs $($tail)*);
    };
    ( $subs:ident $f:tt, ) => {
        $subs.push(term!($f));
    };
    ( $subs:ident $f:tt ) => {
        $subs.push(term!($f));
    };
}

#[macro_export]
macro_rules! pattern {
    ( ? $x:tt ) => {
        Pattern::var($x.clone())
    };
    ( $f:tt ( $( $sub:tt )+ ) ) => {
        {
            let mut subs = Vec::new();
            sub_patterns!(subs $($sub)+);
            Pattern::cons($f.clone(), subs)
        }
    };
    ( $f:tt () ) => {
        {
            Pattern::cons($f.clone(), Vec::new())
        }
    };
    ( $f:tt ) => {
        {
            Pattern::cons($f.clone(), Vec::new())
        }
    }
}

#[macro_export]
macro_rules! sub_patterns {
    ( $subs:ident $f:tt ( $( $sub:tt )* ), $( $tail:tt )+ ) => {
        $subs.push(pattern!($f ($($sub)*)));
        sub_patterns!($subs $($tail)*);
    };
    ( $subs:ident $f:tt ( $( $sub:tt )* ), ) => {
        $subs.push(pattern!($f ($($sub)*)));
    };
    ( $subs:ident $f:tt ( $( $sub:tt )* ) ) => {
        $subs.push(pattern!($f ($($sub)*)));
    };
    ( $subs:ident $f:tt, $( $tail:tt )+ ) => {
        $subs.push(pattern!($f));
        sub_patterns!($subs $($tail)*);
    };
    ( $subs:ident $f:tt, ) => {
        $subs.push(pattern!($f));
    };
    ( $subs:ident $f:tt ) => {
        $subs.push(pattern!($f));
    };
    ( $subs:ident ? $x:tt, $( $tail:tt )+ ) => {
        $subs.push(pattern!(? $x));
        sub_patterns!($subs $($tail)*);
    };
    ( $subs:ident ? $x:tt, ) => {
        $subs.push(pattern!(? $x));
    };
    ( $subs:ident ? $x:tt ) => {
        $subs.push(pattern!(? $x));
    };
}