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
はそのカウント・フィールドへのアドレスとしては実装されていません。