Parsing/RPN calculator algorithm: Difference between revisions

Added Wren
(→‎{{header|PL/SQL}}: Added PL/SQL solution to Parsing/RPN_calculator)
(Added Wren)
Line 5,184:
 
Result: 3.000122</pre>
 
=={{header|Wren}}==
{{trans|Kotlin}}
{{libheader|Wren-seq}}
<lang ecmascript>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)</lang>
 
{{out}}
<pre>
For expression = 3 4 2 * 1 5 - 2 3 ^ ^ / +
 
Token Action Stack
3 Push num onto top of stack [3]
4 Push num onto top of stack [3, 4]
2 Push num onto top of stack [3, 4, 2]
* Apply op to top of stack [3, 8]
1 Push num onto top of stack [3, 8, 1]
5 Push num onto top of stack [3, 8, 1, 5]
- Apply op to top of stack [3, 8, -4]
2 Push num onto top of stack [3, 8, -4, 2]
3 Push num onto top of stack [3, 8, -4, 2, 3]
^ Apply op to top of stack [3, 8, -4, 8]
^ Apply op to top of stack [3, 8, 65536]
/ Apply op to top of stack [3, 0.0001220703125]
+ Apply op to top of stack [3.0001220703125]
 
The final value is 3.0001220703125
</pre>
 
=={{header|Xojo}}==
9,482

edits