to
and defer@
¶Gforth の value にはいくつかの操作子(operators)があります。 to
(is
はエイリアスであり、
defer!
は入力ストリーム内の名前の代わりに xt を受け取ります)や +to
や addr
や
action-of
(defer@
は入力ストリーム内の名前の代わりに xt を受け取ります)です。
Gforth を使用すると、 ワードの (to)
アクションを変更できます。
(to)
( val operation xt – ) gforth-1.0 “paren-to”
name という名前の、 ワードに似ている value の xt です。 name に val を保存します。
operation は、 to
と +to
と addr
と action-of
から選択します。
to-table:
( "name" "xt1" .. "xtn" – ) gforth-experimental “to-table-colon”
TO
や +TO
や ADDR
や ACTION-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
は格納されているワードを示し、 operation は to
風の操作の実際のバリエーションを示します。 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