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


6.10.10.4 The gory details of CREATE..DOES>

DOES> ( compilation colon-sys1 – colon-sys2  ) core “does”

以下は、 一つの定義内で CREATEDOES> の両方を使用する必要がないことを意味します。 DOES> 部分を別の定義に置くことができます。 これにより、 たとえば、 さまざまな DOES> 部分から選択するようにすることができます:

: does1 
DOES> ( ... -- ... )
    code1 ;

: does2
DOES> ( ... -- ... )
    code2 ;

: def-word ( ... -- ... )
    create ...
    IF
       does1
    ELSE
       does2
    ENDIF ;

この例では、 does1does2 のどちらを使用するかの選択は、 子ワードが CREATE される定義時に行われます。

注意: 定義を終了する does> の性質により、 追加の定義 does1does2 を導入する必要があることに注意してください。 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)のアドレス(ワードのデータ・フィールドのアドレス)を取得します。