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]);
vague
2
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 
2 Likes
system
Closed
3
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.