Gauche:空白文字

Gauche:空白文字

ちゃんと対応しようとすると結構面倒なのでちょっとまとめとく。

仕様

R6RSに沿うなら、次の2種の空白を認識する必要がある。

whitespace

トークンの区切りとなる空白。TAB, LF, VT, FF, CR, NEL, および カテゴリがZs, Zl, Zpな文字。

intraline whitespace

文字列リテラル内で行折り返しを挿入する際に考慮すべき空白文字。 TABおよびカテゴリがZsな文字。

文字列リテラル内の行折り返しは、リテラル内に出現する

 '\' <intraline-whitespace>* <line-ending> <intraline-whitespace>*

のシーケンスが無視されることで実現される。 (R6RSのこの箇所はtypoがあって、kleene starが落ちているが、 errataで訂正される予定)。

該当する文字

Unicode EUC-JP SJIS 名前 カテゴリ whitespace intraline
U+0009 0009 0009 character tabulation (TAB) Cc
U+000A 000A 000A line feed (LF) Cc
U+000B 000B 000B line tabulation (VT) Cc
U+000C 000C 000C form feed (FF) Cc
U+000D 000D 000D carriage return (CR) Cc
U+0020 0020 0020 space Zs
U+0085 next line (NEL) Cc
U+00A0 A9A2 8541 no-break space Zs
U+1680 ogham space mark Zs
U+180E mongolian vowel separator Zs
U+2000 en quad Zs
U+2001 em quad Zs
U+2002 en space Zs
U+2003 em space Zs
U+2004 three-per-em space Zs
U+2005 four-per-em space Zs
U+2006 six-per-em space Zs
U+2007 figure space Zs
U+2008 punctuation space Zs
U+2009 thin space Zs
U+200A hair space Zs
U+2028 line separator Zl
U+2029 paragraph separator Zp
U+202F narrow no-break space Zs
U+205F medium mathematical space Zs
U+3000 A1A1 8140 ideographic space Zs

留意点

現在のGaucheでは、'\' の後に来る文字が特別な意味を持たない場合、単に その文字と解釈するようにしている。例えば "\(" は "(" と解釈される。 "\ " は " " と同じだ。これはオフィシャルの仕様じゃないけどたまたまそうなってる。

ただ、リテラル内行折り返しを実装しようとすると、 '\' の後に<intraline-whitespace> が続いて、その後に<line-ending>以外のものが来た場合にちょっと困る。 例えば '\' + SPC + SPC + 'x' とかなってる場合。これまでのような寛大な 処理では、これは " x" と読まれることになるわけだが、ということは <line-ending>を読むまでは<intraline-whitespace>を捨てられない。 <intraline-whitespace>がいくつ来るかはわからないのでこれは面倒だ。

'\' <intraline-whitespace>* の後に<line-ending>以外が来たらエラーに しちゃうのが素直かな。

More ...