Stringオブジェクトは、文字列データ以外にもいくつかのデータを保有しています。具体的には、アクティブ部分をオフセットで示すためのPOSとLIM、文字列のバイト長を格納しているSIZEがあります。
アクティブ部分
Stringオブジェクトには、アクティブ部分というのがあります。これは、文字列全体の中のひとつながりの部分(全体でも可)になります。切れ切れの複数の断片をまとめてアクティブ部分にすることはできません。文字列の処理上はアクティブ部分が実質的な文字列の内容として扱われます。例えば、標準的な文字列取得メソッドであるGET:は、アクティブな部分だけを取り出します。
このアクティブな部分を印づけているのがPOSとLIMです(positionとlimitの略と思われます)。どちらも、文字の場所を表しているのではなく、文字列全体の先頭からのバイトオフセットを表したものであることに注意してください。これら二つの数値で挟まれている部分(POSが先頭、LIMが末尾)がアクティブとなるのです。つまり、例えば、3文字目から9文字目までがアクティブであるというのは、POS=2, LIM= 9ということになるわけです。横書きだとすると、左の端っこが0で、文字と文字の間(ただし、1バイト1文字)に左から1,2,3と番号を割り振っていくわけです。末尾(右端)は、文字列の総バイト数と一致しますね。
PUT:直後は、文字列全体がアクティブになっています。
データを取る
Stringオブジェクトの現在のPOSの値は、POS:というメッセージを送ることによって得られます。LIMの値は、LIM:というメッセージで得られます。
POS: ( -- n )
LIM: ( -- n )
現在のアクティブ部分のバイト長は、LEN:というメッセージで得られます。
LEN: ( -- n )
データを手入力する
アクティブ部分は、手動で設定することができます。>POS:は、トップスタックの値をPOSとし、>LIM:はトップスタックの値をLIMとするメソッドです。
>POS: ( n -- )
>LIM: ( n -- )
現在値からシフトすることもできます。SKIP:は、トップスタック値の分だけ、POSを後方にずらします。MORE:は、トップスタック値の分だけLIMを後方にずらします。
SKIP: ( n -- )
MORE: ( n -- )
このときパラメターはもちろん負の値でもかまいません。その場合には、前方にシフトするわけです。
手入力でアクティブ部分を操作する際には、POS,LIMが負の値になったり、POS > LIMとなったり、LIMが文字列全体の後端からはみ出したりしないように注意しなければなりません。値の入力だけなら特に何も起こりませんが、そのように値が矛盾した状態のままGET:メッセージを送ったりすると、エラーが表示されて処理が停止してしまいます。
初期化
START:メソッドは、POSを0に初期化します。NOLIM:メソッドは、LIMを文末(初期状態)に設定します。RESET:メソッドは、両方をします(POSを0に、LIMを文末に)。
アクティブ部分にかかわらないメソッド
SIZE:メソッドは、アクティブ部分にかかわりなく、常に文字列全体のバイトサイズを返します。
SIZE: ( -- n )
これはサイズ変化の際に計測/格納されるSIZEデータを取り出すため、いちいち
システムコールの必要がなく、高速であるとされています。
文字列データに関して、ALL:メソッドは、アクティブ部分にかかわりなく、常に文字列全体をGET:します。
ALL: ( -- addr len )
関連項目:
最終更新:2018年12月18日 12:45