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