macro_rules! can expand a call into an expression that is checked after expansion.

Program

Play the program to choose an id and build a label through a small expression macro.

id
macro_expr_label.rs
Replay: real traced execution (multi-file project)
macro_rules! make_label {
    ($prefix:expr, $id:expr) => {
        format!("{}-{}", $prefix, $id)
    };
}

fn main() {
    let id = 7;
    let label = make_label!("task", id);
    println!("{label}");
}
macro_rules! make_label {
    ($prefix:expr, $id:expr) => {
        format!("{}-{}", $prefix, $id)
    };
}

fn main() {
    let id = 1;
    let label = make_label!("task", id);
    println!("{label}");
}
macro_rules! make_label {
    ($prefix:expr, $id:expr) => {
        format!("{}-{}", $prefix, $id)
    };
}

fn main() {
    let id = 42;
    let label = make_label!("task", id);
    println!("{label}");
}
  1. id ← 7, label ← "task-7"

    7fn main() {8    let i→ 7d = 7; //@id=7, 1, 429    let labe→ "task-7"l = make_label!("task", id);10    println!("{label}");11}
    outputtask-7
  1. id ← 1, label ← "task-1"

    7fn main() {8    let i→ 1d = 1;9    let labe→ "task-1"l = make_label!("task", id);10    println!("{label}");11}
    outputtask-1
  1. id ← 42, label ← "task-42"

    7fn main() {8    let i→ 42d = 42;9    let labe→ "task-42"l = make_label!("task", id);10    println!("{label}");11}
    outputtask-42
macro_rules! `macro_rules!` defines a declarative macro that rewrites syntax before type checking.
matcher `$prefix:expr` and `$id:expr` capture expression fragments from the call site.
expansion The macro expands to a `format!` expression that produces the final `String`.