Task

Create a stack-based evaluator for an expression in   reverse Polish notation (RPN)   that also shows the changes in the stack as each individual token is processed as a table.



 Assume an input of a correct, space separated, string of tokens of an RPN expression
 Test with the RPN expression generated from the   Parsing/Shunting-yard algorithm   task: 

         3 4 2 * 1 5 - 2 3 ^ ^ / + 

 Print or display the output here


Notes

    ^    means exponentiation in the expression above.
    /    means division.


See also

   Parsing/Shunting-yard algorithm for a method of generating an RPN from an infix expression.
   Several solutions to 24 game/Solve make use of RPN evaluators (although tracing how they work is not a part of that task).
   Parsing/RPN to infix conversion.
   Arithmetic evaluation.


import "/seq" for Stack
 
var rpnCalculate = Fn.new { |expr|
    if (expr == "") Fiber.abort("Expression cannot be empty.")
    System.print("For expression = %(expr)\n")
    System.print("Token           Action             Stack")
    var tokens = expr.split(" ").where { |t| t != "" }
    var stack = Stack.new()
    for (token in tokens) {
        var d = Num.fromString(token)
        if (d) {
            stack.push(d)
            System.print(" %(d)     Push num onto top of stack  %(stack)")
        } else if ((token.count > 1) || !"+-*/^".contains(token)) {
            Fiber.abort("%(token) is not a valid token.")
        } else if (stack.count < 2) {
            Fiber.abort("Stack contains too few operands.")
        } else {
            var d1 = stack.pop()
            var d2 = stack.pop()
            stack.push(token == "+" ? d2 + d1 :
                       token == "-" ? d2 - d1 :
                       token == "*" ? d2 * d1 :
                       token == "/" ? d2 / d1 : d2.pow(d1))
            System.print(" %(token)     Apply op to top of stack    %(stack)")
        }
    }
    System.print("\nThe final value is %(stack.pop())")
}
 
var expr = "3 4 2 * 1 5 - 2 3 ^ ^ / +"
rpnCalculate.call(expr)