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


6.10.10.6 User-defined to and defer@

Gforth の value にはいくつかの操作子(operators)があります。 to (is はエイリアスであり、 defer! は入力ストリーム内の名前の代わりに xt を受け取ります)や +toaddraction-of (defer@ は入力ストリーム内の名前の代わりに xt を受け取ります)です。

Gforth を使用すると、 ワードの (to) アクションを変更できます。

(to) ( val operation xt –  ) gforth-1.0 “paren-to”

name という名前の、 ワードに似ている value の xt です。 nameval を保存します。 operation は、 to+toaddraction-of から選択します。

to-table: ( "name" "xt1" .. "xtn" –  ) gforth-experimental “to-table-colon”

TO+TOADDRACTION-OF のエントリを含むテーブルを作成します。 n/a を使用して、 サポートされていない操作をマークします。

to-method: ( xt table "name" –  ) gforth-experimental “to-method-colon”

to-method を作成します。 ここで、xt はフィールドにアクセスするためのアドレスを計算し、 table にはそれに格納する操作子(operators)が含まれます。

set-to ( to-xt –  ) gforth-1.0 “set-to”

現在のワードの (to) ( val xt -- ) メソッドの実装を to-xt に設定します。

n/a ( ) gforth-experimental “not-available”

このワードをチック(tick)することはできますが、 インタプリタ時およびコンパイル時に “Operation not supported” (操作はサポートされていません)という例外が投げられます(throw)。 サポートされていないメソッドなどにこれを使用します。

(to)to 内で使用されるワードです。 実行時(run-time)に値を保存します。 (to) メソッドの一般的なスタック効果は ( val Operation xt -- ) です。 ここで、 xt は格納されているワードを示し、 operationto 風の操作の実際のバリエーションを示します。 val はそこに格納されている (適切な型の) 値です。

to-table: を使用して to メソッドを実装し、 タイプ固有の操作テーブルを作成し(テーブルの最後にある指定されていないスロットは n/a で埋められます)、 to-method: を、 value の xt からそのデータ・フィールドを取得する操作と組み合わせて使用​​します(通常、 ディクショナリ内の値の場合は >body ですが、 value-style データは構造体またはユーザー領域に存在することもできます)。

たとえば、 以下のように fvalue を実装できます:

to-table: f!-table f! f+!
' >body f!-table to-method: fvalue-to

: fvalue ( r "name" -- ; name: -- r )
  create f,
  ['] f@ set-does>
  ['] fvalue-to set-to ;

5e fvalue foo
: bar foo 1e f+ to foo ;
see bar