Macro tt_call::tt_if [−][src]
macro_rules! tt_if {
{
condition = [{ $($condition : ident) :: * }] input =
[{ $($input : tt) * }] true = [{ $($then : tt) * }] false =
[{ $($else : tt) * }]
} => { ... };
}Expand description
Evaluate a condition and expand to one or the other of two branches.
Input
condition = [{name of predicate macro to invoke}]input = [{arbitrary tokens to pass as input to the predicate}]true = [{tokens to expand to if the predicate returns true}]false = [{and if the predicate returns false}]
The predicate macro must accept a single input value named input. It is
expected to return a single output value which may have any name but must
hold the tokens true or false. For example the built-in tt_is_comma!
predicate expands to is_comma = [{ true }] or is_comma = [{ false }].
Example
use tt_call::{tt_call, tt_if, tt_is_comma, tt_return};
macro_rules! parse_until_comma {
($($input:tt)*) => {
tt_call! {
macro = [{ parse_until_comma_helper }]
before_comma = [{ }]
tokens = [{ $($input)* }]
}
};
}
macro_rules! parse_until_comma_helper {
{
$caller:tt
before_comma = [{ $($before:tt)* }]
tokens = [{ $first:tt $($rest:tt)* }]
} => {
tt_if! {
condition = [{ tt_is_comma }]
input = [{ $first }]
true = [{
tt_return! {
$caller
before_comma = [{ $($before)* }]
}
}]
false = [{
parse_until_comma_helper! {
$caller
before_comma = [{ $($before)* $first }]
tokens = [{ $($rest)* }]
}
}]
}
};
}
fn main() {
assert_eq!(3, parse_until_comma!(1 + 2, three, four));
}