Skip to content

Instantly share code, notes, and snippets.

Created December 22, 2015 21:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save anonymous/1be89e8f76b09e012404 to your computer and use it in GitHub Desktop.
Save anonymous/1be89e8f76b09e012404 to your computer and use it in GitHub Desktop.
Shared via Rust Playground
macro_rules! trn {
(@parse () -> (($a:expr) ($b:expr) ($c:expr))) => {
if $a { $b } else { $c }
};
(@parse (? $head:tt $($tail:tt)*) -> ($a:tt () ())) => {
trn!(@parse ($($tail)*) -> ($a ($head) ()))
};
(@parse (: $head:tt $($tail:tt)*) -> ($a:tt $b:tt ())) => {
trn!(@parse ($($tail)*) -> ($a $b ($head)))
};
(@parse ($head:tt $($tail:tt)*) -> (($($a:tt)*) () ())) => {
trn!(@parse ($($tail)*) -> (($($a)* $head) () ()))
};
(@parse ($head:tt $($tail:tt)*) -> ($a:tt ($($b:tt)*) ())) => {
trn!(@parse ($($tail)*) -> ($a ($($b)* $head) ()))
};
(@parse ($head:tt $($tail:tt)*) -> ($a:tt $b:tt ($($c:tt)*))) => {
trn!(@parse ($($tail)*) -> ($a $b ($($c)* $head)))
};
($($t:tt)*) => {
trn!(@parse ($($t)*) -> (() () ()))
}
}
fn main() {
println!("{}", trn!(false ? 1 : trn!(false ? 2 : 3)));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment