<BUILDS DOES>

<BUILDSとDOES>の対で、固有データを持つワードをつくることができます。単一メソッドのオブジェクトと考えることもできます。

実は<BUILDSは古いForth規格のワードで、現在のANSI規格ではCREATEになります。MopsでもANSI互換モードではCREATEを使います。iMopsでは<BUILDSは定義されておらず、もっぱらCREATEを用いる仕様になっています。以下の<BUILDSを全てCREATEに書き換えるだけで同じ結果が得られます。

もう少し厳密にいえば、<BUILDSとDOES>の対を定義中に持つワードは、別のワードを作り出すためのワードになります。そして、そこで作り出されるワードの動作を定義できるのです。

少し複雑なことをしてみましょう。
0 CONSTANT INTO>
-1 CONSTANT <GETFROM

: MY3VALUEARRAY ( x1 x2 x3 -- :name )
 <BUILDS ROT , swap , ,
 DOES>
 swap
 IF
  dup @ swap 4+ dup @ swap 4+ @
 ELSE
  swap over 8 + ! swap over 4+ ! !
 THEN ;
 
1 2 3 MY3VALUEARRAY MyArray
のようにすれば、MyArrayは初期値"1, 2, 3"のアレイになるわけですが、
<GetFrom MyArray
で三つの値を取り出せますし、
6 7 9 INTO> MyArray
で新しい値を格納することもできるわけです。これ自体はあまり良い方法とはいえませんが、かなりいろいろなことができるという感じはわかるのではないかと思います。

ちなみに、CREATEを用いると、上のMy3ValueArrayの定義は、次のようになります:
: MY3VALUEARRAY ( x1 x2 x3 -- :name )
 CREATE ROT , swap , ,
 DOES>
 swap
 IF
  dup @ swap 4+ dup @ swap 4+ @
 ELSE
  swap over 8 + ! swap over 4+ ! !
 THEN ;


関連項目:






最終更新:2020年04月12日 22:34