Next: , Previous: , Up: User-defined Defining Words   [Contents][Index]


6.10.10.8 Creating from a prototype

上記では、 最初に create を使用してワードを定義し、 それから set-does>set-toset-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> を使用してワードを作成するよりも高速になります。 nonamecreate-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 ;