固定文字列

Mopsでは標準Forth仕様の文字列も用いることができます。Forth文字列は、文字列を格納しているバッファメモリーの先頭のアドレス値と、格納されている文字列のバイト長との2つの値の組で表現されます。スタック効果コメントとしては、addr lenという形でよくあらわれます。

文字列リテラルは、ワードS"と区切り文字"で囲んで表わします。例えば、「I have a G3 iMac.」という文字列リテラルは、
S" I have a G3 iMac."
と書きます。つまり、S"の後には空白が必要ですが、終わりの"の前には空白は要りません。このコードは、実行時には、この文字列リテラルのaddr lenをデータスタックに積みます。

なお、Mopsでは、「S"」の簡約形として「"」を使うことができます。つまり、
" I have a G3 iMac."
としても、上と同値です。

複数の箇所から同じ内容の文字列を利用したいときには、文字列に名前をつけて、名前で呼び出せるようにすれば、便利ですし、メモリー効率も良くなります。その方法を提供するのが、文字列定数です。SCON宣言で創り出します。雛形は:
SCON 名前 (区切り文字)文字列内容(区切り文字)
となります(ただし、コードとして区切り文字に括弧は不要です。)。具体例では、
SCON myMac "I have a G3 iMac."
となります。ここでは区切り文字に「"」を用いましたが、区切り文字には空白文字以外の1バイト文字(ASCII文字)ならなんでも使えます。文字列定数名(空白文字で切れる)の後の最初の非空白文字は区切り文字とみなされ、次にその文字が出てくる直前までが、文字列定数の内容とされます。ですから、文字列自体が「"」文字を内容に含む場合には、違う文字を区切り文字とする必要があるわけです。

一旦宣言がされれば、以後は、その名前を呼び出せば、実行時には該当する内容の文字列のaddr lenがスタックに積まれることになります。

ユニコード文字列について:
Mopsの内部的な文字コードはMacRoman/Shift_JISのようです(少なくともOS9.x上では)。Mops/Forthの文字列は文字を格納したバッファの位置を示すものでしかありませんから、ユニコードエンコーディングの文字列を用いるのには現状のままで何の障害もありません。ただし、コードを転換する機能(ワード)は、少なくともまだ、提供されていないようです。Mopsでは文字列オブジェクトを利用することも多いのですが、最良の方法は、ユニコード用のストリングクラスを書いて、OSが提供するAPIを用いてエンコードを変換する機構を追加することであると思われます。なお、iMopsでは、内部的にはデフォルトでUTF-8になっています。


関連項目:






最終更新:2019年11月20日 08:26