これまで私たちが見てきた例はこまごまとしたものでした。 私たちは Forth を大きめの電卓として使用してきました。 また、 これまでに示した各計算は「1 回限り」のものです – それを繰り返すには、もう一度入力する必要があります6。 このセクションでは、 Forth の語彙(vocabulary)に新しいワードを追加する方法を説明します。
新しいワードを作成する最も簡単な方法は、「コロン定義」を使用することです。 それらがどのように機能するかについて思い悩む前に、 いくつか定義して試してみましょう。 以下の例を入力してみてください。 スペースを正確に反映するように注意してください:
: add-two 2 + . ; : greet ." Hello and welcome" ; : demo 5 add-two ;
この例を打ち込んだら、 すぐ試してみましょう:
greetRET Hello and welcome ok greet greetRET Hello and welcomeHello and welcome ok 4 add-twoRET 6 ok demoRET 7 ok 9 greet demo add-twoRET Hello and welcome7 11 ok
ここで導入した最初の新しいモノは、 :
と ;
というワードのペアです。
これらは、それぞれ新しい定義を開始および終了するために使用されます。 :
の後の最初の単語(word)は、 新しい定義の名前です。
例からわかるように、 定義はすでに定義されているワードから構成されます。 Forth では、 システムの起動時に存在した定義と、 ユーザーが自分で定義した定義とを区別しません。
この例では、 .
(ドット) や、 ."
(ドット・クォート)や、 dup
(デュープ)
というワードも紹介しています。 ドットはスタック頂上から数詞を取得して表示します。 これは .s
に似ていますが、
スタック頂上の項目のみを表示する点と破壊的である点が異なります。 実行後、スタック上にその数値は最早ありません。 数値の前はスペース無しで、
後ろには常に 1 つのスペースが表示されます。 ドット・クォートは、 ワードの実行時に出力される文字列(string)を定義します。 文字列には、
"
を除く任意の印刷可能な文字を含めることができます。 "
には特別な機能があります。 これは Forth
ワードではありませんが、 区切り文字として機能します(区切り文字の仕組みについては次のセクションで説明します)。 最後に、 dup
はスタック頂上の値を複製します。 5 dup .s
と入力して、 dup
がやることを確認してください。
あなたは、 既に、 テキスト・インタープリターが名前を見つけるためにディクショナリーを検索することを知っています。 あなたが上記の例の通りにした場合、
add-two
という定義がすでにあるはずです。 それでは、 この定義に対して、 更に新しい定義を入力して変更してみるとしましょう:
: add-two dup . ." + 2 = " 2 + . ;RET redefined add-two ok
Forth は、私たちがすでに存在するワードを定義しようとしていることを認識し、 それを警告するメッセージを出力しました。 さて、 それでは、 新しい定義を試してみましょう:
9 add-twoRET 9 + 2 = 11 ok
ただし、 ここで実際に行ったことは、 特定の名前を付けて新しい定義を作成することだけです。 同一の名前の定義がすでに存在するという事実は、 (Forth
が警告メッセージを出力することを除いて、)新しい定義の作成方法に何の違いもありません。 add-two
の古い定義はいまだ存在します(これが正しいかどうかを確認するには、 demo
をもう一度試してください)。 add-two
の新しい定義以降に定義するワードは add-two
の新しい定義を利用しますが、 demo
の定義は、 古い定義は
demo
をコンパイルする時点で既に存在していた add-two
の古い定義のバージョンを引き続き使用します。
次のセクションに進む前に、 あなた自身のワードをいくつか定義したり再定義したりしてみましょう。