大幅な変更に見えるが、実は……
今回umeboshiを大きく変更しました。以前までは逆ポーランド記法そのままの入力を受け取っていましたが、今回の変更でCommon Lispのような、いわゆるポーランド記法での入力を受け取れるようにしました。例えば
umeboshi>> 1 2 +
3
umeboshi>> 12 x bind
umeboshi>> $x
12
以前はこんな具合だったのですが、今回の変更で
umeboshi>> (+ 1 2)
3
umeboshi>> (define x 12)
umeboshi>> $x
12
というふうになりました。そして実はカッコなしでも同じ結果になります。今のところ、四則演算・比較演算・変数・printだけしかできませんが、今後できればlambda・cons・car・cdr・condあたりまで実装できれば、とりあえず純Lisp的な何かにできるのではなかろうかと思っています(lambdaあたりがエベレストばりに高い壁に感じますが……)
なぜこの変更を行ったか
私はバカの1つ覚えと言われても仕方ないのですが、ポップしてプッシュするといったスタックの仕組みを用います。逆ポーランドはまさにそれをそのままを扱うものですが、先日ふとひらめきがありました。Common LispのS式って逆にすれば同じでないの?と。(今頃感は否めない)例えば
> (cons 1 (cons 2 nil))
(1 2)
以前までこれを素直に前から構文解析しようとして、カッコの扱いに困っていたのですが、カッコを取っ払って逆にしてみたところ
nil 2 cons 1 cons
あれ?逆ポーランド計算機でできそうという考えに至りました。つまり、もともとポーランド記法のCommon Lispなのだから、逆にすればいいじゃない、という単純なヒラメキです。この場合、構文解析の際、逆ポーランド計算機同様、正規表現を使う必要はありません。しかし今後の道が険しすぎる……このやり方には限度があるような気もします……