EVAL3

まあ続きやりましょうか。1週間に10分しかプログラミングする時間ないの?と言われてしまいそうだが、仮にそうだとすると30年で260時間か。限られたものしか作れないけど、極端に少ないわけでもない。あ、コーディングと言ったほうがよかったか。紙のノートに向かって考える時間はもう少しある。まあそれはいいよ。

カッコについては別のやり方にした。まず、前処理として、式全体をカッコで囲んでおく。「(」を見つけたら再帰呼び出し、「)」を見つけたら式の終端とする。関数の戻り値としては、処理した文字数を返す(エラーなら負の数を返す)。これで、O(n)で行ける?本当かな。自信がない。オーダーが変わるほどの工夫をした覚えがないから不安になる。これで行けるなら、以前の方法でも工夫すれば同等の速度が出せるはず。あー、カッコの深さだけスタックを消費するのがポイントかな。

さて、演算子の検出が必要だ。二項演算子だけではなく、単項演算子もあるというのが厄介。とりあえず、現在の(文字列への)ポインタが演算子で始まっているかどうかを判定。長い演算子からチェックしていく。ここの高速化は、(必要ではないだろうけど)後からでも簡単にできると思うので、とりあえずはバグが出ないことを最優先に書いていい。演算子でなかったら、スペース(の役割をする文字)か数値リテラルということになる。

数値リテラルのデコードが、また嫌らしい。小数点と指数と16進数が必要。まあこれは順次処理していけばいいか。あと、単位(kmとかアンペアとか)も使えるようにしたい。単位を、演算子扱いにするか、数のリテラルに含めるか、新に単位というものを考えるか。これがまた迷う。単位を[km]のように囲うことは許可したい(強制はしたくない)。仮に演算子としたら、優先順位は最高レベルだよね。「4km/h」で、kmとhを別々に持って「/」を通常の演算子とするか、あるいは「km/h」を予め登録しておかなければ使えないようにするか。むずっ。

数値(単位を除く)の検出が終わったときに、演算子でないなら単位とみなす?そもそも、数値のない単位(4*kmとか)は認めるべき?関係ないけど「exp(log(4km))」は計算できたほうがいいだろうか。ねむい。不本意ながら続く。