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)のアドレス(ワードのデータ・フィールドのアドレス)を取得します。