RubyでRPN計算機

Jun 6, 2019 21:28 · 431 words · 1 minute read

最近読んでいる実践Rust入門に、逆ポーランド記法で記述された数式を計算するプログラムが載っていた。

普通によく見る数式は1 + 2のように書きこれを中置記法と呼ぶが、
逆ポーランド記法は1 2 +というように演算子が後ろにくる。なので後置記法ともいう。

それをRubyで書いてみた。

例えば
6.1 5.2 4.3 * + 3.4 2.5 / 1.6 * -6.1 5.2 4.3 * + 3.4 2.5 / 1.6 * -
こういう式を計算できる。

def rpn(exp)
    stack = []

    exp.split(' ').each do |token|
        if /^[+-]?[0-9]*[\.]?[0-9]+$/ =~ token
            stack.push token.to_f
        else
            x = stack.pop
            y = stack.pop
            stack.push y.send(token, x)
        end
    end

    stack.pop
end

exp = gets.strip
ans = rpn(exp);
puts "exp = #{ans}"

あまり面白みはない。
Rustの例だとクロージャやジェネリクスやトレイト境界などの例にもなっていたが、こちらは単純に書いた。
不正なトークンやエラーも考慮していない。

強いていうなら

x = stack.pop
y = stack.pop
stack.push y.send(token, x)

この部分がちょっと「おっ」となるくらい。
まあスタックを使えば簡単に書けるんだな、ということがわかる程度のものなのでご勘弁を。

本当は中置記法から逆ポーランド記法に変換、などもやりたかったが
「もう書いた?」としきりに急かされたのでそれはまた別の機会に。