2019/06/14

umeboshi 0.3.0リリース

大幅な変更に見えるが、実は……

今回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なのだから、逆にすればいいじゃない、という単純なヒラメキです。この場合、構文解析の際、逆ポーランド計算機同様、正規表現を使う必要はありません。
しかし今後の道が険しすぎる……このやり方には限度があるような気もします……