Forthのごく単純なサブセットを評価する評価機を実装します。
Forthはスタックベースのプログラミング言語です。 Forthの小さなサブセットを評価する、ごく基本的な評価機を実装しましょう。
評価機は次のワードに対応する必要があります。
+、-、*、/(整数演算)DUP、DROP、SWAP、OVER(スタック操作)また、慣習的な構文 : word-name definition ; を使って新しいワードを定義する機能にも対応する必要があります。
話を簡単にするため、対応が必要なデータ型は16ビット以上の符号付き整数だけです。
構文には次のルールを使います。数値は1つ以上の(ASCII)数字の並びで、ワードは数値ではない1つ以上の英字、数字、記号、句読点の並びです。 (Forthはおそらくもう少し違うルールを使っていますが、これで十分近いはずです。)
ワードは大文字と小文字を区別しません。
Forthでは、関数はwordsと呼ばれ、データスタック上で動作します。
各ワードはスタックから入力を受け取り、結果をスタックに返します。
Forthのドキュメントでは、ワードを実行する前と実行した後のデータスタックの状態を、常に( p1 p2 ... pN --- r1 r2 ... rN )のように表記します。
p1からpNは、呼び出し前にスタックにあるワードの入力を表し(スタックのさらに下のほうには、ここには示していないデータが残っていることもあります)、r1からrNは、呼び出し後にスタックにあるワードの戻り値を表します。
区切りの---は、ワードを実行する前と後でスタックの状態がどう変わるかを示しています。
実装するワードは、次のとおりです。
| ワード | スタックの状態 | 説明 |
|---|---|---|
+ |
( a b --- sum ) |
sum = a + b |
- |
( a b --- diff ) |
diff = a - b |
* |
( a b --- prod ) |
prod = a * b |
/ |
( a b --- quot ) |
quot = a / b |
dup |
( a --- a a ) |
ToSの値を複製します |
drop |
( a --- ) |
ToSの値を取り除きます |
swap |
( a b --- b a ) |
ToSの2つの値を入れ替えます |
over |
( a b c --- a b c b ) |
2番目の値をToSにコピーします |
オンラインのForthインタプリターで遊んでみたい方や、実装するワードについてもっと知りたい方は、Easy Forthを試してみてください(特にAdding Some Numbers、Defining Words、Stack Manipulationのセクションです)。