ディクショナリー(辞書)は、 allot
でメモリーを割り当てることができる、 単なるメモリー領域ではなく、
複数のワード・リスト(wordlist)上にある Forth ワード達も含まれています。 ワード・リスト内のワードを検索するとき、 概念的には、
最も新しいワードから検索を開始し、 古いワードに向かって進みます(実際には、 最近のほとんどのシステムはハッシュ・テーブルを使用します)。 つまり、
古いワードと同一の名前のワードを定義すると、 新しいワードが古いワードを隠します。
どのワードリストがどの順序で検索されるかは、 検索順序スタック(the search order)によって決まります。 order
で検索順序を表示できます。 最初に検索されるワードリストから順に検索順序を表示し、 その次に、 新しく定義されるワードを含むワードリストを表示します。
wordlist ( -- wid )
を使用して、 新しい空のワード・リスト(wordlist)を作成できます:
wordlist constant mywords
Set-current ( wid -- )
は、 新しく定義されたワードを入れるワード・リストを設定します(the current
wordlist):
mywords set-current order
このワード・リストは wordlist
を使用して匿名で作成されたため、 Gforth は mywords
のワード・リスト名を表示しません。
get-current ( -- wid)
で現在のワード・リストを取得できます。 現在のワード・リストに影響を与えずに、
指定のワード・リストに何かを入れたい場合、 通常は以下のようにします:
get-current mywords set-current ( wid ) create someword ( wid ) set-current
検索順序スタック(the search order)は set-order ( wid1 .. widn n -- )
で記述し、
get-order ( -- wid1 .. widn n )
で読み取ることができます。 ( n を除いて) もっとも TOS
側のワード・リストが最初に検索されます。
get-order mywords swap 1+ set-order order
ええ、 order
の出力内のワードリストの順序は、 スタック・コメントや .s
の出力とは逆になっているため、
直感的ではありません。
研究課題(assignment):
>order ( wid -- )
を定義して、 最初に検索されるワード・リスト(wordlist)としてwid
を検索順序スタック(the search order)に追加してみましょう。previous ( -- )
を定義してみましょう。 これは、 最初に検索されたワードリスト(wordlist)を検索順序スタックから削除するものです。 定義したら、 境界条件を試してみましょう(クラッシュや、 そこから抜け出すことが困難または不可能な状況がいくつか見られる事でしょう)。
検索順序スタック(the search order)は、 Modula-2 モジュールや、 C++ の名前空間と同様の機能を提供するための強力な基盤です。 ただし、 この方法でプログラムをモジュール化しようとすると、 デバッグや 再利用/ファクタリング に関しては、 (大規模なプロジェクトの経験はありませんけれども、)著者の経験では利点を上回る欠点があります。 他の言語/プログラミング環境では、 デバッグや再利用がそれほど強力ではないため、 これらの欠点はそれほど目立ちません。
こしらも参照ください: Word Lists