Gauche:文字クラスのカバー範囲
Shiro(2019/09/20 12:58:46 UTC): 曖昧に運用してきたんだけどissueが立った (#496, #525) ので真面目に考える。
問題
- charset literal、regexp literalにおける、
\d,\s,\w[:alpha:]等のPOSIX文字クラス
- srfi-14 predefined charsetの
char-set:letter等
これらは、Unicode範囲までカバーすべきか、ASCII範囲に止めるか。
0.9.8まで
中途半端だった
\d,\s,\wはASCII範囲のみ[:digit:],[:space:],[:blank:]はASCII範囲のみ、それ以外のPOSIX文字クラスはUnicode全域char-set:digit,char-set:whitespace,char-set:blankはASCII範囲のみ、それ以外のpredefined charsetはUnicode全域
digit, whitespaceが特別扱いなのは、\d, \s がそれらを利用してるため。
で、例えば入力値のバリデーション等にASCII範囲の数字、スペース、文字を想定して\d、
\s、\wを使っているコードが大量にあるので、
これらを変えると予想外のコードを壊す怖れがある。
0.9.9の方針
\d、\s、\w
これらは変更の影響が大きいので、ASCII範囲に限定する
POSIX character class
一貫してることが望ましい。
PCREやOnigurumaを見ると、フラグで切り替えられるようになっている。デフォルトはASCIIのようだ。
regexp literalはオプションを与えることが出来る (e.g. #/.../u でUnicode全域、とか)が、charset literalの方はやりにくい。
また、リテラルはリード時の問題なので、パラメータでも切り替えにくいし、
そういう暗黙な切り替えデータとしてそれらのリテラルを含むファイルを読み込む際に
振る舞いが予想外になったりするので好ましくない。
そこで、[:alpha:]などはASCII範囲とし、
Unicode全域を含める場合は[:ALPHA:]と大文字にすることにした。
srfi-14 predefined charset
こちらは原則Unicode全域とし、ASCII範囲に限定したものとして
char-set:ascii-letter など ascii- をつけたものを用意した。