Next: , Previous: , Up: Tokens for Words   [Contents][Index]


6.12.2 Name token

Gforth は、名前付きワードを「名前トークン」name token(nt)で表します。 名前トークンは、 引数または、 以下のワードの結果として発生するセル・サイズの抽象データ型です。

Gforth 1.0 以降、 ほとんどのワードの nt の具体的な実装は、 xt と同一アドレスです(これは xt のための基本 nt (primary nt)です)。 ただし、 synonym と、 aliase と、 interpret/compile: で定義されたワードは、 別のワードから xt を取得しますが、 (xt とは異なり)依然として自分独自の nt を持ちます。 したがって、 Gforth 1.0 固有のコードを作成する準備ができている場合でも、 xt と nt を同一の意味で使用することはできません。 >name を使用してこれら自分独自の nt を持つワードの xt から代替 nt を取得することはできません。

``x (Gforth 1.0 以降) または、 以下を使用して、 ワード x の nt を取得します

find-name ( c-addr u – nt | 0  ) gforth-0.2 “find-name”

現在の検索順序スタック(the search order)で名前 c-addr u を見つけます。 nt が見つかった場合はそれを返し、 それ以外の場合は 0 を返します。

find-name-in ( c-addr u wid – nt | 0  ) gforth-1.0 “find-name-in”

wid で識別されるワードリストで、 c-addr u の文字列で指定された定義を検索します。 nt が見つかった場合はそれを返し、 それ以外の場合は 0 を返します。

latest ( – nt  ) gforth-0.6 “latest”

nt は、 最後に定義されたワードの名前トークンです。 最後のワードに名前がない場合は 0 です。

latestnt ( – nt  ) gforth-1.0 “latestnt”

nt は、 最後に定義されたワードの名前トークンです(訳注: 名前が無い場合でも nt を返す。 その nt を name>string すると、 長さ 0 の文字列(addr u) を返す)

>name ( xt – nt|0  ) gforth-0.2 “to-name”

xt で表されるワードの基本名前トークン(primary name token) nt を取得します。 xt が ぢつは xt でない場合(非 xt を xt と誤認する可能性が低いヒューリスティック・チェックを使用)、 または基本 nt (primary nt)が名前無しワードである場合は 0 を返します。 Gforth 1.0 の時点では、 すべての xt に基本 nt がありますが、 他の名前付きワードも同一のインタプリタ機能(interpretation sematics) xt を持つ可能性があります。

xt>name ( xt – nt  ) gforth-1.0 “xt-to-name”

xt の基本 nt (primary nt)を生成します。 xt が、 ぢつは xt でない場合、 nt は nt であるとは保証されません。

以下を使用すると、 ワードリスト内のすべての nt を取得できます

traverse-wordlist ( ... xt wid – ...  ) tools-ext “traverse-wordlist”

f が false になるかワードリストがなくなるまで、 ワードリスト wid 内のワード nt ごとに xt ( ... nt – f ... ) を 1 回実行します。 xt はスタックその下側を自由に使用できます(訳注: つまり TOS に f さえ返せばスタックに何が積まれても(積まれなくても)気にしない)

nt を使用すると、 ワードのインタプリタ機能(interpretation semantics)とコンパイル機能(compilation semantics)や、 その名前や、 ワードリスト内の次のワードのワード、 にアクセスできます:

name>interpret ( nt – xt  ) tools-ext “name-to-interpret”

xt はワード nt のインタプリタ機能(interpretation semantics)を表します。

name>compile ( nt – w xt  ) tools-ext “name-to-compile”

w xt はワード nt のコンパイル・トークン(compilation token)です(訳注: コンパイル・トークン CT は 2セル構成)。

name>string ( nt – addr u  ) tools-ext “name-to-string”

addr count は、 nt で表されるワードの名前です。

id. ( nt –  ) gforth-0.6 “i-d-dot”

nt で表されるワードの名前を出力します。

.id ( nt –  ) gforth-0.6 “dot-i-d”

id. の F83 での名前です。

name>link ( nt1 – nt2 / 0  ) gforth-1.0 “name-to-link”

ワード nt1 の場合、 同じワードリスト内の1つ前のワード nt2 を返します。 前のワードがない場合は 0 を返します。

名前なしワードは通常、 インタプリタ機能(interpretation compilation)も無く、 コンパイル機能(compilation semantics)も無く、 名前も無く、 単語リストにもありません。 しかし、Gforth (1.0 以降) ではすべてのワードは等しいため、 名前無しのワードにも nt があります(ただし、 ワードリストには含まれません)。 その nt は latestnt で取得でき、 nt を消費する上記のワード群はこれらの nt に対して適切な処理を行います。

使用例として、 以下のコードは、デフォルト以外のコンパイル機能(compilation semantics)を持つ forth-wordlist 内のすべてのワードをリストします:

: ndcs-words ( wid -- )
  [: dup name>compile ['] compile, <> if over id. then 2drop true ;]
  swap traverse-wordlist ;

forth-wordlist ndcs-words

このコードは、 コンパイル・トークンの xt 部分が compile, の xt である場合、 ワードがデフォルトのコンパイル機能(compilation semantics)を持っていると仮定しています。

いにしえの Forth システムの nt に最も近いのはネーム・フィールド・アドレス(NFA)ですが、 Gforth とは顕著な違いがあります。 いにしえの Forth システムでは、 各ワードに一意の NFAとLFAとCFAとPFA(または、LFAとNFAとCFAとPFAの順)があり、 あるワードから次のワードへと進むためのワードがありました。 これとは対照的に、 Gforth では、 いくつかの nt が name>interpret xt からは同一の xt を取得できます。 名前トークンによって識別される構造体にリンク・フィールドがありますが、 通常、 検索にはこれらの構造体の外部にあるハッシュ・テーブルが使用されます。 Gforth の名前はセル幅のカウントおよびフラグ・フィールド(cell-wide count-and-flags field)がありますが、 nt はそのカウント・フィールドへのアドレスとしては実装されていません。


Next: Compilation token, Previous: Execution token, Up: Tokens for Words   [Contents][Index]