RosettaCodeData/Task/Parsing-RPN-calculator-algorithm/Wren/parsing-rpn-calculator-algorithm.wren
2024-03-06 22:25:12 -08:00

32 lines
1.2 KiB
Text

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)