BrainF*ck in Vim

http://d.hatena.ne.jp/kei-os2007/20080719/1216440837
BrainF*ck の Vim 実装がこちらで公開されているのだが、問題点がいくつかある。

  • ループの入れ子ができない
  • 出力が1文字ごとに改行される

で、勉強がてら書き直してみた。


フルスクラッチです。まあこの程度の量なので。
先に挙げた問題点の修正の他、構造や呼び出し方もなんとなく変えてみた。

ヒープ

普通ならリストを使うところなんだろうけど、長さ足りなくなったら長くしたりとか面倒だったので、辞書で実装。
必然的にマイナス方向へのポインタ移動も可能に!っていいのかそれ。

メインループ

各命令を辞書関数にすることでif-elseを排除した。メインループすっきり。
…まあ直接定義できなかったのでわざわざ代入し直してるわけだけど。

使い方

ここは正直どうでも良かったので適当に自分好みにした。
Bf() で実行系に使う辞書が生成されるので、その辞書の run() にソースとなる文字列を入れて呼べばいい。
たとえば、ソースを Yank して以下のようにすれば実行できる。

call Bf().run(@")

ちなみに Bf() が返す辞書内に命令の関数もヒープも各種カウンタも全部入ってる。
実行後に中身を覗けば終了時の状態とか見れるはず。整形しないと見づらいだろうけど。


今思えば Bf(src) で実行できても良かったな。こうなったのは本当になんとなく。意味はない。

まとめ

最近役に立たないコードしか書いてないorz

2009/04/02 追記

コード部分をgistに張り付けた。