Next: , Previous: , Up: Strings and Characters   [Contents][Index]


6.8.3 String and Character literals

文字列リテラル(string literal)を記述する至高の方法は、 "STRING" と記述することです。 s\" の場合と同じく、 バックスラッシュによるエスケープ(\-escapes)を使用できます。 ただし、 この方法は標準ではないため(non-standard)、 移植性を高めるためには以下のいずれかのワードを使用することをお勧めします:

s\" ( compilation ’ccc"’ – ; run-time – c-addr u  ) core-ext,file-ext “s-backslash-quote”

これは s" と似ていますが、 C言語のようなバックスラッシュ・エスケープ・シーケンス(\-escape-sequences)を次のように変換します: \a BEL (ビープ音)、 \b BS 、 \e ESC (not in C99)、 \f FF 、 \n 改行(newline)、 \r CR 、 \t HT 、\v VT 、\" " 、 \\ \ 、 \[0-7]{1,3} 8進数(非標準)、 \x[0-9a-f]{0,2} 16進指定char値(標準は2桁のみ)、 \u[0-9a-f]{4} ユニコード・コードポイント(サロゲート・ペア自動マージ;auto-merges surrogate pairs)、 \U[0-9a-f]{8} 拡張ユニコード・コード・ポイント。 \ は他の文字よりも前に予約されています。
注意: \xXX は生のバイトを生成することに注意してください。 一方、 \uXXXX と \UXXXXXXXX は、 現在のエンコーディングのコード・ポイントを生成します。 たとえば、 UTF-8 エンコーディングを使用し、 ä (コード・ポイント U+00E4)をエンコードしたい場合は、 次のように指定できます: 文字 ä 自体を記述するか、 \xc3\xa4 (このコード・ポイントの UTF-8 バイト) または \u00e4 または \U000000e4 を記述します。
注意: C言語とは異なり、 \n はホストOS に適した改行シーケンスを生成します。 これは複数の文字で構成される場合があります。 つまり、 "\n"newline と同等です。

S" ( compilation ’ccc"’ – ; run-time – c-addr u  ) core,file “s-quote”

コンパイル・モードコードは " (二重引用符) を区切り文字として文字列 ccc をパースします。 その実行時コードは、 長さ u と 文字列の開始アドレス c-addr を返します。 インタプリタ時: 同様に文字列をパースし、 c-addru 返します。 Gforth では文字列(string)を allocate します。 結果として生じるメモリ・リークは通常は問題ではありません。 例外は、 S" を含む文字列を作成し、 その文字列を evaluate する場合です。 その場合、 リークはインタプリトされたファイルのサイズに制限されないため、 文字列を free することもできます。 Forth-2012 では、それぞれ 80 文字のバッファーが 2 つしか保証されないため、 標準プログラムでは、 文字列は 2 つ前の s" までしか存続していない想定する必要があります。

同様に、 'C' を使用すると、 文字 C のコード xc を取得できます。 この方法は Forth-2012 から標準化されています。 これを取得する古い方法は、 以下のいずれかのワードを使用することです:

char ( ’<spaces>ccc’ – c  ) core,xchar-ext “char”

先頭のスペース達をスキップします。 文字列 ccc をパースし、 ccc の最初の文字の文字コード c を返します(訳注:ASCII以外の文字コードもいけるっぽい(LANG=ja_JP.UTF-8) char あ hex . decimal 3042 ok)

[char] ( compilation ’<spaces>ccc’ – ; run-time – c  ) core,xchar-ext “bracket-char”

コンパイル状態: 先頭のスペース達をスキップします。 文字列 ccc をパースします。 その実行時コード: ccc の最初の文字の文字コード c を返します。 このワードのインタプリタ機能(interpretation semantics)は未定義です。

通常は、 コロン定義の外側で char 使用するか、 コロン定義の内側で [char] を使用するか、 単にその両方で 'C' を使用するかです。

注意: 例えば、

"C" type

の方が下記よりも(わずかに)効率的です

'C' xemit

なぜなら、 後者はコード・ポイントをバイトのシーケンスに変換し、 それらを個別に emit するからです。 同様に、 一般的な文字達を扱う場合は、 通常、 コード・ポイントではなく文字列として表す方が効率的です。

S" または 'C' では生成できない、 一般的に使用される文字や文字列を生成するために以下のワード群があります:

newline ( – c-addr u ) gforth-0.5 “newline”

ホストOSの改行シーケンスを含む文字列(訳注: 文字コードを返す訳では無いことに注意。 文字列の内容は LF だったり CRLF だったりする)

bl ( – c-char  ) core “b-l”

c-char は空白(space)の文字コード値です。

#tab ( – c  ) gforth-0.2 “number-tab”
#lf ( – c  ) gforth-0.2 “number-l-f”
#cr ( – c  ) gforth-0.2 “number-c-r”
#ff ( – c  ) gforth-0.2 “number-f-f”
#bs ( – c  ) gforth-0.2 “number-b-s”
#del ( – c  ) gforth-0.2 “number-del”
#bell ( – c  ) gforth-0.2 “number-bell”
#esc ( – c  ) gforth-0.5 “number-esc”
#eof ( – c  ) gforth-0.7 “number-e-o-f”

実際には EOT (ASCII コード 4 別名 ^D)


Next: String words, Previous: String representations, Up: Strings and Characters   [Contents][Index]