Macro for list of number or null

I have following macro to transform list of number or null, but it doesn't support negivate number. How to solve it?

    macro_rules! tree_element {
        (null) => {
            None
        };
        ($e:expr) => {
            Some($e)
        };
    }
    macro_rules! tree {
        ( $($t:tt),* ) => {
            vec![ $(tree_element!($t)),* ]

        };
    }
    dbg!(tree![1, 2, 3]);
    dbg!(tree![1, null, 3]);
    // dbg!(tree![-1, null, 3]);

Since $tt can match single token or tokens in delemiters, you can already make negative number work by wrapping it in parentheses: tree![(-1), null, 3]

If you don't want parentheses, use the tt-muncher trick instead.

macro_rules! tree {
    (#inner $v:ident:) => {};
    (#inner $v:ident: null $(,)? ) => {
        let ele = None;
        $v.push(ele);
    };
    (#inner $v:ident: $head:expr $(,)? ) => {
        let ele = Some($head);
        $v.push(ele);
    };
    (#inner $v:ident: null , $( $rest:tt )+ ) => {
        let ele = None;
        $v.push(ele);
        tree!{ #inner $v: $($rest)* }
    };
    (#inner $v:ident: $head:expr , $( $rest:tt )+ ) => {
        let ele = Some($head);
        $v.push(ele);
        tree!{ #inner $v: $($rest)* }
    };
    ( $( $t:tt )* ) => {{
        let mut __v = Vec::new();
        tree!{ #inner __v: $($t)* }
        __v
    }};
}

Rust Playground

Edit: add cases for tree![] and tree![null]that require type annotation :slight_smile:

2 Likes

This topic was automatically closed 90 days after the last reply. We invite you to open a new topic if you have further questions or comments.