逆ポーランド記法以外のForthの話

なんか最近Forthが注目されてきているような気がするので、Forthについて書きます。

はじめにForthとの出会いについて書いて、その後CREATE・DOES>について書きます。

昔々、高校に入学したということでFM-NEW7を買ってもらいました。F-BASICをしばらく使っていましたが、余りに使いにくくて不満に思っていました。そのとき、Oh!FMにDIFEという小さいForth(システム全体で2K)の処理系が載りました。打ち込んで、結構使い込みました。カセットインタフェースとPSGを叩いて録音・再生するとかそんなことをしていました。
その後、LispRubyにはまったり、CやPascalFortranに別の意味ではまったりしてForthは余り使っていないのですが、やっぱり思い入れのある言語です。

さて、今手元に井上外志雄さん著の標準Forthがあって久しぶりに紐解いてみました。この本を読んで一番衝撃だったのが、CREATE・DOES>です。この2つのワードを使うと普通の言語では文法とされている事柄をユーザが定義できます。でも、実は使ったことがないです・・・。DIFEにはなかったし。

例えば、変数を宣言するためのワードVARIABLEはこんな感じで定義できます。以下標準Forthからの引用です。

  : VARIABLE CREATE 2 ALLOT DOES> ;

こんな感じで使えます。なお、:と;はVARIABLEというワードを定義するための構文です。この構文もForthで定義できるのかなー?分からないです。標準ForthにはForthのソースコードが載っているのですが、そこでは機械語で書かれています。

  VARIABLE FOO

こうすると、FOOという名前の変数が定義されます。定義されるとき、CREATEからDOES>までのワードが実行されます。ALLOTはユーザ辞書領域(変数の為の領域)のポインタ増やして領域を確保するためのワードです。

つぎに、

  FOO

とFOOを実行すると、VARIABLE FOOを実行したときのユーザ辞書領域のポインタがスタックに積まれDOES>以降が実行されます。この場合は、DOES>以降は何もないので、何もしないです。こうして、FOOを実行するとユーザ定義辞書領域のポインタがスタックにつまれて変数として使えるわけです。
CREATE・DOES>のところに処理を書くといろいろできそうです。あと、Forthから離れてこの考え方を利用したプログラマブルプリプロセッサとか面白そうです。

へたくそな説明ですみません。