Macro tt_call::tt_replace

source ·
macro_rules! tt_replace {
    {
        $caller:tt
        condition = [{ $($condition:ident)::* }]
        replace_with = [{ $($with:tt)* }]
        input = [{ $($input:tt)* }]
    } => { ... };
}
Expand description

Replace each token that matches a given predicate by a given replacement sequence of tokens. [tt-call]

§Input

  • condition = [{ name of predicate macro }]
  • replace_with = [{ arbitrary tokens inserted when the predicate is true }]
  • input = [{ arbitrary input tokens }]

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_ident! predicate expands to is_ident = [{ true }] or is_ident = [{ false }].

§Output

  • tokens = [{ tokens after replacement }]

§Example

use tt_call::{tt_call, tt_replace, tt_return};

macro_rules! is_lowercase_self {
    {
        $caller:tt
        input = [{ self }]
    } => {
        tt_return! {
            $caller
            is = [{ true }]
        }
    };

    {
        $caller:tt
        input = [{ $other:tt }]
    } => {
        tt_return! {
            $caller
            is = [{ false }]
        }
    };
}

macro_rules! closure {
    ($($expr:tt)+) => {
        |__value| tt_call! {
            macro = [{ tt_replace }]
            condition = [{ is_lowercase_self }]
            replace_with = [{ __value }]
            input = [{ $($expr)+ }]
        }
    };
}

fn main() {
    let add_one = closure!(self + 1);
    println!("{}", add_one(1));
}