CREATE..DOES>
¶DOES>
( compilation colon-sys1 – colon-sys2 ) core “does”
以下は、 一つの定義内で CREATE
と DOES>
の両方を使用する必要がないことを意味します。
DOES>
部分を別の定義に置くことができます。 これにより、 たとえば、 さまざまな DOES>
部分から選択するようにすることができます:
: does1 DOES> ( ... -- ... ) code1 ; : does2 DOES> ( ... -- ... ) code2 ; : def-word ( ... -- ... ) create ... IF does1 ELSE does2 ENDIF ;
この例では、 does1
と does2
のどちらを使用するかの選択は、 子ワードが CREATE
される定義時に行われます。
注意: 定義を終了する does>
の性質により、 追加の定義 does1
と does2
を導入する必要があることに注意してください。 set-does>
を使用するとこれを回避できます:
: def-word ( ... -- ... ) create ... IF [: code1 ;] set-does> ELSE [: code2 ;] set-does> ENDIF ;
標準のプログラムでは、 最後のワードが CREATE
で定義されている場合にのみ DOES>
部分を適用できます。
Gforth では、 DOES>
部分は、 いかなる場合でも定義された最後のワードの振る舞いをオーバーライドします。
標準のプログラムでは、 DOES>
はコロン定義でのみ使用できます。 Gforth では、 一種のワンショット・モードとして、
インタープリター状態で使用することもできます。 例:
CREATE name ( ... -- ... ) initialization DOES> code ;
これは、 以下の標準のと同等です:
:noname DOES> code ; CREATE name EXECUTE ( ... -- ... ) initialization
Gforth は対話時に打ち込んだコード内での引用(quotations)もサポートしており、 引用は現在の定義を保存および復元するため、 上記の例を以下のように記述することもできます:
CREATE name ( ... -- ... ) initialization [: code ;] set-does>
set-does>
( xt – ) gforth-1.0 “set-does>”
現在のワードを変更して、 本体アドレスをプッシュしてから xt を実行します。 それに応じて compile,
の実装も変更します。 より効率的な実装が必要な場合、 この後で set-optimizer
を呼び出します。
>body
( xt – a-addr ) core “to-body”
xt で表されるワードの本体(body)のアドレス(ワードのデータ・フィールドのアドレス)を取得します。