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-
をつけたものを用意した。