macro_rules! eval_postfix {
    (@operator [$b:expr, $a:expr $(,$call_stack:expr)*] $operator:tt $($leftover:tt)*) => { ... };
    (@operator $call_stack:tt $operator:tt $($leftover:tt)*) => { ... };
    ($call_stack:tt + $($leftover:tt)*) => { ... };
    ($call_stack:tt - $($leftover:tt)*) => { ... };
    ($call_stack:tt * $($leftover:tt)*) => { ... };
    ($call_stack:tt / $($leftover:tt)*) => { ... };
    ($call_stack:tt % $($leftover:tt)*) => { ... };
    ($call_stack:tt > $($leftover:tt)*) => { ... };
    ($call_stack:tt >= $($leftover:tt)*) => { ... };
    ($call_stack:tt < $($leftover:tt)*) => { ... };
    ($call_stack:tt <= $($leftover:tt)*) => { ... };
    ($call_stack:tt == $($leftover:tt)*) => { ... };
    ($call_stack:tt != $($leftover:tt)*) => { ... };
    ($call_stack:tt && $($leftover:tt)*) => { ... };
    ($call_stack:tt || $($leftover:tt)*) => { ... };
    ($call_stack:tt ^ $($leftover:tt)*) => { ... };
    ($call_stack:tt & $($leftover:tt)*) => { ... };
    ($call_stack:tt | $($leftover:tt)*) => { ... };
    ($call_stack:tt << $($leftover:tt)*) => { ... };
    ($call_stack:tt >> $($leftover:tt)*) => { ... };
    ([$($call_stack:expr),*] $num:tt $($leftover:tt)*) => { ... };
    ([$res:expr]) => { ... };
    ([$($call_stack:expr),*]) => { ... };
    ($($tokens:tt)*) => { ... };
}
Expand description

Evaluate a mathematical expression in postfix notation (“Reverse Polish Notation”) at compile time. greater than, less than etc. are also possible.

What is the advantage?

The postfix notation does not need parentheses, which means less typing - especially for long, complicated formulas. Implementations of the postfix notation only need a stack - which is commonly associated with faster evaluations. It does need however a bit time to get used to it.

Returns

The result of the calculation.

Supported Operators

  • + - Plus
  • - - Minus
  • * - Multiplication
  • / - Division
  • % - Modulo
  • > - Greater than
  • >= - Greater than or equal to
  • < - Less than
  • <= - Less than or equal to
  • == - Equals
  • != - Does not equal
  • && - Logical AND
  • || - Logical OR
  • & - Bitwise AND
  • | - Bitwise OR
  • ^ - Bitwise XOR
  • >> - Bitshift Right
  • << - Bitshift Left

Examples

extern crate lib_rapid;
use lib_rapid::math::postfix::eval_postfix;
println!("{}", eval_postfix!(1.0 1.0 + 2.0 %)); // Prints "0", because (1 + 1) % 2 = 0.
use lib_rapid::math::postfix::eval_postfix;
assert_eq!(0.0, eval_postfix!(1.0 1.0 + 2.0 %));
assert_eq!(16, eval_postfix!(1 1 + 2 / 4 <<));
assert_eq!(1, eval_postfix!(16 2 * 5 >>));
assert_eq!(true, eval_postfix!(1.0 1.0 + 2.0 % 0.0 ==));