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>以外が来たらエラーに しちゃうのが素直かな。