encoding commit

やり残しがあるけど、やる気が起きないので先延ばし。まあ char 型の圧縮が終わってからの方が面倒が少なくていいし。

char 型を 27 bit にする懸案

ISO-2022 で規定されてる、94x94x94 とか 96x96x96 の文字集合って存在するんだっけ?

まだできない

string-set! とか、stateful な encoding が絡むと無理過ぎ。例えば

ESC $ ( D A A B B C C ESC ( B

っていう 3 文字が入ってる ISO-2022-JP-2 な string s があったとして、それに (string-set! s 2 #\A) とした場合にどう動くか。ESC ( B を挿入してそのあと ESC $ ( D を入れるというのは余りにも困難。mbrlen() 相当のものを primitive に採用してるから殆んど対応不可能。やっぱり入出力時に文字集合を tag したものに canonicalize する他ない。

test

とっくに本体はできあがってるんだけど、test を書くのに四苦八苦。FSF Emacs 上で

文章の間に\217\217とか言って認識失敗したコードがある

部分を強制的にその数値のまま記録させるにはどうしたらええんでしょうか。Anyone?

追記: 無理矢理 sed で解決。

encoding.c

アホみたいな事になってる。ちょっと馬鹿正直に書き過ぎか?

static ScmMultibyteCharInfo eucjp_scan_char(ScmMultibyteString mbs)
{
    const char *str = SCM_MBS_GET_STR(mbs);
    const int size  = SCM_MBS_GET_SIZE(mbs);
    ENTER;

    if (!size)
        RETURN(0);

    if (IN_CL(str[0]) || IN_GL96(str[0]))
        RETURN(1);
    else if (IN_GR94(str[0]) || (uchar)str[0] == SS2) {
        if (size < 2)
            RETURN_INCOMPLETE(1);
#if SCM_STRICT_ENCODING_CHECK
        if (!IN_GR94(str[1]))
            RETURN_ERROR(1);
#endif
        RETURN(2);
    } else if *1
            RETURN_ERROR(1);
        if (size < 3)
            RETURN_INCOMPLETE(2);
        if (!IN_GR94(str[2]))
            RETURN_ERROR(2);
        RETURN(3);
#else  /* not SCM_STRICT_ENCODING_CHECK */
        if (size < 3)
            RETURN_INCOMPLETE(size);
        RETURN(3);
#endif /* not SCM_STRICT_ENCODING_CHECK */
    }

    RETURN_ERROR(1);
}

encoding の test を書いてた…はず。

( ゜д゜;)ハッ!
いつの間にか詰将棋に夢中に! (ぉ

マクロ

気違い沙汰だね。何のための中置記法主義なんだか。Java とか C とか、生産性を求めるとどうやっても前置記法になるよね。特に JavaVector を実装したときはワロタ。あれで前置記法読みにくいとか言ってる輩が存在するのが信じられない。思いっ切り前置記法やんけお前、と。
演算子多重定義とか、D の implicit getter/setter があれば随分違うわけですが、でもあれも数年〜十数年したら trend の変化に耐えられなくなるんだろうなー。その点やっぱり LISP はスゲーや。初めに開き直った結果、今でも殆んど構文が変わってない。

datas.c

色々詰め込みすぎ。

operations.c

だるぅ。またこいつか。

ああ、さっさと終わらせないと compaction と競合するな。というわけで nice (-20);

*1:uchar)str[0] == SS3) { #if SCM_STRICT_ENCODING_CHECK if (size < 2) RETURN_INCOMPLETE(1); if (!IN_GR94(str[1]