A macro repetition can accept a comma-separated list and expand that list into another expression.

Program

Play the program to choose the middle word in a repeated macro input.

extra
macro_repetition_words.rs
Replay: real traced execution (multi-file project)
macro_rules! collect_words {
    ($($word:expr),+ $(,)?) => {{
        let values = vec![$($word),+];
        values.join(",")
    }};
}

fn main() {
    let extra = "green";
    let joined = collect_words!("red", extra, "blue");
    println!("{joined}");
}
macro_rules! collect_words {
    ($($word:expr),+ $(,)?) => {{
        let values = vec![$($word),+];
        values.join(",")
    }};
}

fn main() {
    let extra = "gold";
    let joined = collect_words!("red", extra, "blue");
    println!("{joined}");
}
macro_rules! collect_words {
    ($($word:expr),+ $(,)?) => {{
        let values = vec![$($word),+];
        values.join(",")
    }};
}

fn main() {
    let extra = "gray";
    let joined = collect_words!("red", extra, "blue");
    println!("{joined}");
}
  1. extra ← "green", joined ← "red,green,blue"

    8fn main() {9    let extr→ "green"a = "green"; //@extra="green", "gold", "gray"10    let joine→ "red,green,blue"d = collect_words!("red", extra, "blue");11    println!("{joined}");12}
    outputred,green,blue
  1. extra ← "gold", joined ← "red,gold,blue"

    8fn main() {9    let extr→ "gold"a = "gold";10    let joine→ "red,gold,blue"d = collect_words!("red", extra, "blue");11    println!("{joined}");12}
    outputred,gold,blue
  1. extra ← "gray", joined ← "red,gray,blue"

    8fn main() {9    let extr→ "gray"a = "gray";10    let joine→ "red,gray,blue"d = collect_words!("red", extra, "blue");11    println!("{joined}");12}
    outputred,gray,blue
repetition `$($word:expr),+` captures one or more comma-separated expressions.
optional trailing comma `$(,)?` accepts a final comma without requiring one.
expansion list `$($word),+` repeats the captured expressions inside `vec!`.