rpn_calculator_algorithm.sf 669 B

12345678910111213141516171819202122232425262728293031
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/Parsing/RPN_calculator_algorithm
  4. #
  5. var proggie = '3 4 2 * 1 5 - 2 3 ^ ^ / +';
  6. class RPN(arr=[]) {
  7. method binop(op) {
  8. var x = arr.pop
  9. var y = arr.pop
  10. arr << y.(op)(x)
  11. }
  12. method run(p) {
  13. p.each_word { |w|
  14. say "#{w} (#{arr})";
  15. if (w ~~ /\d/) { arr << w.to_f }
  16. elsif (w ~~ %w(+ - * /)) { self.binop(w) }
  17. elsif (w == '^') { self.binop('**') }
  18. else { die "#{w} is bogus" }
  19. }
  20. say arr[0]
  21. assert_eq(arr[0], 3.0001220703125)
  22. }
  23. }
  24. RPN.new.run(proggie)