Forth

Forth

上級

説明

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は、呼び出し後にスタックにあるワードの戻り値を表します。 区切りの---は、ワードを実行する前と後でスタックの状態がどう変わるかを示しています。

実装するワードは、次のとおりです。

  • ToSはスタックの先頭(Top of Stack)のことです
  • スタックの先頭は、一番右の値として表します
ワード スタックの状態 説明
+ ( 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のセクションです)。

GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Odin Exercism

Forthを始める準備はできましたか?

Exercismに登録すれば、73個の演習、そして本物の人間によるメンタリングとともに、Odinを学んでマスターできます。すべて無料です。