逆ポーランド電卓を実装してみました。

第30回Ruby/Rails勉強会に参加しました - サイログ。MiyakoとかRubyとかなんとか+Miyako ACCESS MAPより。
初級者レッスンで逆ポーランド電卓のお題が出ていたようなので、僕も実装してみました。やっぱりエラーチェックが面倒です…

def rpn(expr)
  result = expr.inject([]) do |stack, e|
    case e
    when :+, :-, :*, :/
      raise "invalid expr." if stack.size < 2
      o2 = stack.pop
      o1 = stack.pop
      raise "divided by 0." if e == :/ and o2.zero?
      stack.push(o1.send(e, o2))
    when Integer
      stack.push(e)
    end
  end
  raise "invalid expr." unless result.size == 1 
  result.first
end

def main(args)
  expr = args.map do |arg|
    case arg
    when /^\d+$/
      arg.to_i
    when '+', '-', '*', '/'
      arg.to_sym
    else
      raise "invalid input #{arg}."
    end
  end
  puts rpn(expr)
end

if __FILE__ == $0
  # main(['1', '2', '+', '3', '4', '+', '*', '10', '-'])
  main(ARGV)
end

参照: 日本Rubyの会 公式Wiki - 第30回 Ruby勉強会@関西