NipoPlusに演算機能を実装する必要があり、色々調べたところ「逆ポーランド記法」という方法が電卓の実装として最も良さそうだったので作ってみました。
逆ポーランド記法とは#
通常の数式は「1 + 1 」のように数値と数値の間に演算子が入ります。(infix)
逆ポーランド記法ではこの式を「1 1 +」のように表します。(postfix)
この逆ポーランド記法の何が良いかというと計算式の優先順位を変化される()を使わずに表記できることにあります。
例えば「(1+2)×3」を逆ポーランド記法では「1 2 + 3 ×」と表現できます。カッコが無くなるため、計算処理を書くのが非常に楽になります。
通常の数式を逆ポーランド式に変換する(Typescript)#
起動させたときの画面イメージは次のようになります。
電卓をポチポチ押して式を作り、最後に「変換」ボタンを押すと逆ポーランド記法の式(厳密には配列)にした結果を下に表示するだけのプログラムです。
通常の数式を逆ポーランドに変換するアルゴリズムは探すと結構たくさんでてきますが、実際にコードとしてのサンプルは思ったより少なかった印象です。
年季の入ったアルゴリズムなのにサンプルが少ないのはちょっと意外でした。
参考にさせていただいたコードでは1文字までしか対応していないため、複数桁や小数点にも対応できるようにコードを改良しています。
また入力もユーザができるように電卓のフォームを用意しました。
コードはTypescript&Vue3(script setup記法)です。
入力された文字は数値の場合つながった文字列として入力され、四則演算記号は半角スペースで区切って入力されます。
これでsplitでスペースをキーとして分解するときに複数桁数の数字が1つの値として扱えます。
逆ポーランド式を最終的には配列の形で利用したかったので、このサンプルでは逆ポーランド式を配列として出力するようになっています。
これらのシンプルな四則演算に加えて、NipoPlusでは「テンプレートの入力フォーム」を式に埋め込めるように少し改良もしています。
実際の用途としてはテンプレートの中のある値同士を計算するための式入力用として逆ポーランドを使いました
逆ポーランドの式を計算する#
逆ポーランド記法の数式を計算するサンプルは少し探すとたくさん出てきましたので、ここではおまけ程度に載せておきます。
逆ポーランド記法はシンプルに計算できるし拡張しやすい#
今回NipoPlusの四則演算機能を実装するにあたり、どのようなやり方が一番良いか色々調べました。式をそのまま実行できるevalなどを使いたくなりますがevalは基本的に使わない方針で開発しているので、代替案として浮上したのが今回のテーマである「逆ポーランド記法」でした。
逆ポーランド式さえ作れてしまえば計算は結構簡単ですし、独自の拡張も仕込みやすいので個人的にはとても良いやり方だったと思いました。
他にも色々解決策はあると思いますが、一つの方法としてご紹介させていただきました。