macro_rules! match_literal_vector {
(match $lit_vec:expr => $out:ident {
$(
$ty:ident => |$($var:ident),+| $(-> $ret:ident)? { $body:expr }
),+
$(,)?
}) => { ... };
(@inner_start
$lit_vec:expr;
$out:ident;
[$($ty:ident),+];
[$({ $($var:ident),+ ; $($ret:ident)? ; $body:expr }),+]
) => { ... };
(@inner
$lit_vec:expr;
$out:ident;
[$ty:ident $(, $ty1:ident)*];
[$({$_ty:ident ; $($_var:ident),+ ; $($_ret:ident)? ; $_body:expr}),*] <>
[$({ $($var:ident),+ ; $($ret:ident)? ; $body:expr }),+]
) => { ... };
(@inner
Integer;
$lit_vec:expr;
$out:ident;
[$($ty:ident),*];
[$({$_ty:ident ; $($_var:ident),+ ; $($_ret:ident)? ; $_body:expr}),*] <>
[
{ $($var:ident),+ ; $($ret:ident)? ; $body:expr }
$(,{ $($var1:ident),+ ; $($ret1:ident)? ; $body1:expr })*
]
) => { ... };
(@inner
Float;
$lit_vec:expr;
$out:ident;
[$($ty:ident),*];
[$({$_ty:ident ; $($_var:ident),+ ; $($_ret:ident)? ; $_body:expr}),*] <>
[
{ $($var:ident),+ ; $($ret:ident)? ; $body:expr }
$(,{ $($var1:ident),+ ; $($ret1:ident)? ; $body1:expr })*
]
) => { ... };
(@inner
$ty:ident;
$lit_vec:expr;
$out:ident;
[$ty1:ident $(,$ty2:ident)*];
[$({$_ty:ident ; $($_var:ident),+ ; $($_ret:ident)? ; $_body:expr}),*] <> [
{ $($var:ident),+ ; $($ret:ident)? ; $body:expr }
$(, { $($var1:ident),+ ; $($ret1:ident)? ; $body1:expr })*
]
) => { ... };
(@inner
$ty:ident;
$lit_vec:expr;
$out:ident;
[];
[$({$_ty:ident ; $($_var:ident),+ ; $($_ret:ident)? ; $_body:expr}),*] <>
[{ $($var:ident),+ ; $($ret:ident)? ; $body:expr }]
) => { ... };
(@inner_finish
$lit_vec:expr;
$out:ident;
[$({$ty:ident ; $($var:ident),+ ; $($ret:ident)? ; $body:expr}),+]
) => { ... };
(@expand_ret $out:ident; $ty:ident; $body:expr) => { ... };
(@expand_ret $out:ident; $_ty:ident; $ret:ident; $body:expr) => { ... };
}Expand description
A macro for matching on LiteralVector variants.
Float variant expands to F16, F32, F64 and AbstractFloat.
Integer variant expands to I32, I64, U32, U64 and AbstractInt.
For output both Literal (fold) and LiteralVector (map) are supported.
Example usage:
ⓘ
match_literal_vector!(match v => Literal {
F16 => |v| {v.sum()},
Integer => |v| {v.sum()},
U32 => |v| -> I32 {v.sum()}, // optionally override return type
})ⓘ
match_literal_vector!(match (e1, e2) => LiteralVector {
F16 => |e1, e2| {e1+e2},
Integer => |e1, e2| {e1+e2},
U32 => |e1, e2| -> I32 {e1+e2}, // optionally override return type
})