class RPNError < RuntimeError end def rpneval(s) a = Array.new while s.length != 0 case s when /^([\d.]+[eE]?[\d.]*)(.*)/ a.push $1 when /^([-+*\/])(.*)/ raise RPNError, "Not enough arguments" if a.length < 2 args = [eval(a.pop), eval(a.pop)] a.push eval("#{args[1]} #{$1} #{args[0]}") else raise RPNError, "Syntax error after `#{s}'" end s = $2.strip end raise RPNError, "Stack not empty" if a.length != 1 return a.pop end puts rpneval(ARGV[0])