【Rust自作TUI電卓】再帰を越えて:実装まとめと進化のロードマップ #10

はじめに

文字列をバラバラに分解し、木を組み立て、そこに「環境」という命を吹き込む。これまで数回にわたって進めてきた「ターミナル関数電卓」の開発は、フィボナッチ数列の計算成功という一つの大きな山場を迎えました。

今回は、ここまでの実装の全体像を整理(復習)し、これからこのツールをどう進化させていくのか、最新のロードマップを公開します。

リポジトリ

tucalc (Tui (,Tukumo) calc)

tucalc (Tui (,Tukumo) calc)

自作している電卓のリポジトリ

github.com

これまでの記事一覧

第1回 構想編【Rustで作る】ターミナル関数電卓を設計する(アーキテクチャ編) #1
第2回 Lexer実装:【Rust】自作計算機エンジンへの道:Lexer(字句解析)で数式をトークンに分解する #2
第3回 tomlの読み込み:【Rust】TOMLで関数を自由に追加!自作電卓に設定読み込みとホットリロードを実装する #3
第4回 Parserの実装(基礎):【Rust】数式を「計算の木」へ:ASTと再帰下降構文解析で電卓エンジンの心臓部を作る #4
第5回 Parserの実装(関数):【Rust】関数の「事前パース」で電卓を高速化!AST管理とデバッグ出力の実装 #5
第6回 比較演算子の実装 :【Rust】電卓に「論理」を。比較演算子の実装と優先順位の階層設計 #6
第7回 Evaluatorの実装 :【Rust】計算機自作:演算と比較を評価するEvaluatorの実装(式指向の設計) #7
第8回 履歴参照($n)の実装:【Rust】計算機:過去の計算を再利用!履歴参照($n)の実装とファイルの永続化 #8
第9回 Evaluatorの完成:【Rust】TUI電卓自作,電卓が「言語」になった日:if文の実装と再帰関数によるフィボナッチ計算 #9

1. これまでの歩み:TUIの基本と4層のアーキテクチャ

本ツールのUI部分(TUI)は、以前連載していた「Rustで作る本格TUI開発入門」の知見をベースに構築しています。

Rustで作る本格TUI開発入門 初回: Ubuntu上で Rust × ratatui の開発環境構築方法・TUI上にHelloWorld表示まで

デフォルト画像 5 記事
シリーズ

Rustで作る本格TUI開発入門

Rust環境で ratatuiのカーゴを用いて、TUIツールを自作できるようになるまでの環境構築と、ツールを作成して公開...

この電卓は、コンパイラやインタプリタの設計思想に基づいた「4つのコンポーネント」で構成されています。

コンポーネント役割達成した技術的ポイント
Lexer字句解析chars().peekable() による1文字先読みと2文字演算子 (<=, !=) の判別。
Parser構文解析再帰下降構文解析による演算子の優先順位制御。Box<Expr> を用いた再帰的な木構造の構築。
Evaluator評価エンジンlocal_env によるスコープ管理と if 文の遅延評価。スタックオーバーフローを防ぐ depth 制限。
History永続化$n による過去結果の引用。.calc_history への非同期的な書き出しと再起動時の復元。

2. 最大の成果:再帰計算の実現

今回の開発で最も楽しかったのは、以下の数式が電卓上で「動いた」瞬間です。

\[fib(n) = \begin{cases} n & (n < 2) \\ fib(n-1) + fib(n-2) & (n \ge 2) \end{cases}\]

これを実現するためには、単なる数値計算だけでなく、「条件によって評価する枝を変える(短絡評価)」や「関数を呼び出すたびに新しい変数空間を作る」といった、プログラミング言語に近い高度な処理が必要でした。Rustの堅牢な型システムと match 式のおかげで、これらを安全に実装することができました。

この実装を通して、プログラミング言語の理解に少し近づいたように思います。


3. 未来へのロードマップ

基本機能は完成しましたが、「道具」としての磨き込みはここからです。今後のアップデート予定を4つのフェーズで計画しています。まずは、基本関数の定義に着手していこうと思います。

Phase 1:数理的・論理的基盤の拡充(まずは、初等関数)

まずは、電卓としての「語彙」を圧倒的に増やします。現状、三角関数も使えない電卓になっているので、それぞれを個別に実装していけたらテストもしやすいかなと思っています。

  • 基本関数のネイティブ実装: sin, cos, tan, log, exp, sqrt などの数学関数を、TOML定義ではなくRust側で高速なネイティブ関数として順次追加。
  • ビット演算の実装: <<, >>, &, |, ~, ^ (XOR) の追加。プログラマ向け電卓への進化。
  • 進数表記の柔軟化: 0x(16進数)や 0b(2進数)の入出力、およびリアルタイムな表記切り替え。
  • 変数の代入機能: 予約語に引っかからない変数を新規でインスタンス内のみで使えるものとして作る(使用感を見つつ、過去の履歴で事足りそうな気もするので作るかは検討中)

Phase 2:UX/UI の洗練(使い勝手の向上)

ターミナルツールとしての快適さを追求します。(とりあえず、Phase 1の目途が立ったら対応予定)

  • 補完・ハイライト: Ratatui を活用し、入力中のキーワードに色を付け、Tabキーでの関数名補完を実装。
  • エラーの可視化: 構文エラーの位置を「^」で指し示すなど、デバッグ情報の親切化。

Phase 3:エコシステムの構築

  • 標準ライブラリ (std.toml): 物理定数や複雑な公式を、外部TOMLファイルとしてデフォルト同梱。
  • プラグイン機構: ユーザーが独自のTOMLディレクトリを指定し、起動時に自動ロードする仕組みの強化。

Phese 4 : ubuntu で apt installできるようにする

作るだけ作って、SSDやHDDの肥やしにするのはもったいないので、ある程度使える状態になったら、.debにまとめてubuntuならどこでもダウンロードして使えるようにしようと思っています。(時期未定)


さいごに

「自分の欲しい道具を、自分の手で、一から組み上げる」。

このプロジェクトは、単なるプログラミング以上に、計算機そのものへの理解を深める旅でもありました。

次回からは、初等関数の実装を少しずつ行い、より実用的な「ターミナルの相棒」として育てていこうと思います。もし興味があれば、皆さんもLexerから自作電卓を作ってみませんか?きっと、普段使っている言語の裏側が見えてくるはずです。

次回 基本関数(実数処理)の実装:関連記事は、2026年5月13日に公開予定 (あと3日)

では、次の記事で。 lumenHero