上記では、 最初に create
を使用してワードを定義し、 それから set-does>
や set-to
や set-optimizer
などで変更する方法を示しました。
別の方法として、 以下のワード群を使用してプロトタイプを作成し、そのプロトタイプから新しいワードを作成します。
この種のコピーでは本体(body)部分は網羅されないため、 明示的に割り当てて初期化する必要があります。 上記の fvalue
を例に取ると、 代わりに以下のように定義できます:
create fvalue-prototype ( -- r ) ['] f@ set-does> [: >body ]] literal f@ [[ ;] set-optimizer ['] fvalue-to set-to : fvalue ( r "name" -- ; name: -- r ) ``fvalue-prototype create-from f, reveal ;
このアプローチの利点は、まず create
ヘッダー・メソッド達を複製し、 それらを変更し、 最終的に重複排除する必要がないため、
fvalue
ワード群の作成が高速化されることだ。 ただし、 この利点は、
この定義ワードで作成されるワードの数が膨大な場合にのみ意味があります。
create-from
( nt "name" – ) gforth-1.0 “create-from”
指定の nt のように振る舞うが、 ボディが空のワード name を作成します。 nt は名前付きワードの nt
でなければなりません。 結果として得られるヘッダーはまだ非公開状態です(訳注: not yet
reveal;ワードリスト未登録なので普通は呼び出せない)。 set-
ワード群を使用せずに create-from
でワードを作成すると、 set-
ワード群または immediate
または does>
を使用してワードを作成するよりも高速になります。 noname
で create-from
を使用できます。
reveal
( – ) gforth-0.2 “reveal”
(reveal;明らかにする、暴露する)ヘッダー定義時の現在のワード・リスト(wordlist current)に現在のワードを入れます。
noname
を定義ワードとともに使用しても、 パフォーマンス上の利点は得られません。 したがって、 以下もいっしょに使います
noname-from
( xt – ) gforth-1.0 “noname-from”
指定の xt のように動作するが、 本体が空の名前のないワードを作成します。 xt は、 名前のないワードの xt でなければなりません。
以下に使用例を示します:
``fvalue-prototype noname create-from latestnt constant noname-fvalue-prototype : noname-fvalue ( r -- xt ; xt execution: -- r ) noname-fvalue-prototype noname-from f, latestxt ;