文字列リテラル(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} 拡張ユニコード・コード・ポイント。 \
は他の文字よりも前に予約されています。
注意:
\x
XX は生のバイトを生成することに注意してください。 一方、 \u
XXXX と \U
XXXXXXXX は、
現在のエンコーディングのコード・ポイントを生成します。 たとえば、 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-addr と
u 返します。 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
)