ポケコンが欲しい

ポケコンという物を知っているでしょうか? 一定以上の世代じゃないと御存知ないかと思いますが、正式には「ポケットコンピュータ」と言い、関数電卓+BASICプログラム+αのようなものと思っていただいて結構です。プリンタが付いていたりグラフを描ける物もありましたが、一番便利な機能は[Ans]ボタンと変数が計算式に使えることでした。
入社時に秋葉原で購入したのですが、壊れてしまいましたorz 新しく買うこともできるのですが、もう自分で作ってしまえ、と。
[Ans]ボタンは直近の計算結果を再表示するものです。この機能はWindows付属の電卓でも[コピー]すれば可能なのですが、[Ans]と違って自動ではありません。
変数は任意の文字列(BASICに使うコマンドなど一部使用不可の文字列もある)に数値や文字列を代入するものです。プログラムをやっている方なら常識ですね。
ちょっとした計算をして、その結果を"A="と書いて[Ans]ボタンを押し、Aに計算結果を代入します。別の計算をして、次はBにその結果を代入します。
で、AはBの何パーセントなのかを計算したかったら"A/B*100"と入力する。電源を入れている間はAとBの値は維持されているので、次に計算してCに代入し、"A/C*100"と再計算するときに使えるわけです。
AとかBだと分かりにくいですが、最初の計算結果"A"を"ANS_Base"、次の"B"を"Root_1"、"C"を"Root_2"とか変数名を工夫すれば憶えやすいので非常に便利なのです。
[使用している変数一覧]を表示してくれる機能が有った気がしますが、変数名と値だけが表示されるのであまり使わなかった気がします。値を出した計算式も表示してくれると便利だと思うのですが、なにしろメモリが64Kバイトなのでそこまで望むのは酷という物でしょう。そのメモリでBASICプログラムの格納、実行までやっていたわけですから。
BASICも欲しいとは思うのですが、そこまではさすがに作れるとは思っていません。
ちなみにポケコンの外観はパソコンのキーボードに関数用ボタンと数行表示できる液晶画面がついているものです。[Esc]〜[F12]の位置に液晶がついていました。何しろボタンが足りないのでファンクションキーを押すと[tan]が[tan-1]になる、といった方法が採られていました。
Windows関数電卓同様"EXP"が使えるので9.999…E+99、つまり100桁の計算が可能。と言うか、Windows関数電卓がこの機能をサポートしているわけですが。
普通の生活をしている限り、EXPのお世話になることはほとんどありません。一般に売られている電卓にはEXPの機能が無く、表示桁数が12程度で固定されているのはそのためです。
ところがこれが天文になると話が違ってきます。一天文単位はメートルにすると149597870691メートルです。すでに12桁使用してしまいます。光分だと桁が飛んでしまいます。高校で地学を専攻していた関係で、関数電卓は必須のものでした。小数点以下の桁が大きかったので精度も高く、実に便利。
ちなみにエディタには「Mifes8」を使用しているのですが、Mifesにも計算機能がついています。"1.56E+9/3.56E+5"と入力してマクロを呼び出すと計算してくれます。テキストとして入力した計算式なので、エディタ上にそのまま計算式が残るので便利。変数はサポートされていないので変数の代わりにはコピペするしかありません。
さて、ポケコンも同様に文字列で計算をしなくてはなりません。入社した時の新人研修は確かC言語で電卓を作る、というものでした。数字をテンキーで入力して、四則演算子を入れて、という程度のものだったのでかなり簡単なものです。四則演算のルールである乗算(×)除算(÷)が優先とか、括弧を使った計算なんてものはサポートしていませんでした。
要するに、数字入力→四則演算子入力→数字入力→計算→四則演算子入力→数字入力→計算…とシーケンシャルなことをしていただけ。
今度は関数電卓です。入力は「文字列」になります。乗除優先も括弧もサポートしなければなりません。さて、どうやったら良いものか。
最初に考えたのは文字列を頭から解析していって、四則演算子や括弧や関数などと数字を分離してから優先順位に従って計算する方法でした。
この方法はゼロ除算エラー(1/0=?となって計算不能になる)や桁溢れを防げるという利点があるのですが、結構面倒です。
特に括弧が入れ子構造になると優先順位を決めたり、入れ子構造を何階層まで許すかを決めたりという問題が生じます。
一番楽なのは文字列の計算式をそのまま実行してくれることです。
しかし、その方法がわかりません。あちこち調べてみたのですが、VBのバージョンが違っていたり?してコピペしても動作しません。
結果的に海外のフォーラムまで行ってやっとの事でVB6で動作させる方法を見つけました。


Private Sub Form_Load()
Dim calc_code As Object
code_string = "cos(12+15*3)"

Set calc_code = CreateObject("MSScriptControl.ScriptControl")
'文字列は言語はVBScript
With calc_code
.Language = "VBScript"
.AddCode ("RET=" & code_string)
ans = .Eval("RET")
End With

Debug.Print ans

End Sub

"code_string"の計算式を計算して、デバッグウインドウに結果を表示するものです。「Microsoft Script Control 1.0」コンポーネント必須。
これを"code_string"に入力する値をテキスト入力窓から持ってきて代入、計算結果を同じ窓に表示するようにして、計算結果を[Ans]で呼び出せるようにして、変数をサポートして、各種関数の入力時にちょっと入力を楽にする("cos("と入力したら閉じ括弧を自動で入力し、カーソル位置を括弧内に移動させる等)処理を入れればOK。あ、16進と10進の変換をキー一つでやる機能も忘れちゃイカン。
無意味にURLエンコード・デコード機能も入れ込んでみたり。
三角関数もゼロ除算や発散の原因になるのでそのチェック程度は入れるかな。…三角関数、学校出てから使ったこと無いけど。
さて、しばらくはこれで遊べるかな?
お約束を書き忘れていました。
上のコードは商用・個人用を問わずご利用いただいて結構です。また、こちらへの通知は必要ありません。