macro_rules! function {
($name:ident -> $out:ty, $pat:ident!($($args:tt)*)) => { ... };
(pub $name:ident -> $out:ty, $pat:ident!($($args:tt)*)) => { ... };
($name:ident, $pat:ident!($($args:tt)*)) => { ... };
(pub $name:ident, $pat:ident!($($args:tt)*)) => { ... };
}