Gauche:文字クラスのカバー範囲

Gauche:文字クラスのカバー範囲

Shiro(2019/09/20 12:58:46 UTC): 曖昧に運用してきたんだけどissueが立った (#496, #525) ので真面目に考える。

問題

これらは、Unicode範囲までカバーすべきか、ASCII範囲に止めるか。

0.9.8まで

中途半端だった

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

More ...