RubyでRPN計算機
最近読んでいる実践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)
この部分がちょっと「おっ」となるくらい。
まあスタックを使えば簡単に書けるんだな、ということがわかる程度のものなのでご勘弁を。
本当は中置記法から逆ポーランド記法に変換、などもやりたかったが
「もう書いた?」としきりに急かされたのでそれはまた別の機会に。