[Anthy-dev 2267] Re: r5rs: SigSchemeへの要望

Back to archive index

Jun Inoue jun.l****@gmail*****
2005年 8月 23日 (火) 06:30:28 JST


On Mon, 22 Aug 2005 17:06:25 +0900
Kazuki Ohta <mover****@hct*****> wrote:

> > {}がcaseラベルと同レベルに並んでますが、これはlisp眼で見なかった
> > 事にできるので私的には割とどうでもいいです。他の方はどうだかわか
> > りませんが。
> 他の人にとってみづらかったら修正します。なのでどんどん指摘して下さい。

これは見づらいです。例えば
    switch (x) {
    case y:
        puts ("きゃー");
        break;
    default:
    {






















    }
    } /* あれ? 同じネストレベル? */
なんて事が起き得ます。(あと大抵のエディタはデフォルトでは拒否するはず)
コメントを入れればそれぞれの括弧が何のためかわかりますが、インデントで視
覚的に伝えられる情報をコメントで示すのは本末転倒だと思います。


引用が前後しますが、
> > 私の場合はcaseラベルとインデントでブロック境界(ブロックじゃない
> > ですが)を視認してるんで、switch中の処理の流れを追うのには{}は関
> > 係無いですね。case毎の{}のありなしは視覚的というよりも論理的にス
> > コープとかスタックの昇り降りの発生として認識していると思います。
> 逆に僕は何か区切りが無いと視認しづらいんですよね...

うーん、習った環境の違いか、私は C を見ると (x86) アセンブラが見えます。
switch は特に。case ラベルが (左に寄せてれば) 一応の切れ目を示しますし、
変数を追加しないなら括弧をつける必要を感じません。

ヤマケンさんも書かれていますが、C の switch は本質的にブロック処理の if-
else と違って、明示的な goto です。例えば、有名な話にDuff's device とい
うのがあって、こんな処理も C89 準拠です。C99 でも可変長配列が絡まない限
り OK。
    switch (count % 8) {
        case 0:        do {  *to = *from++;
        case 7:              *to = *from++;
        case 6:              *to = *from++;
        case 5:              *to = *from++;
        case 4:              *to = *from++;
        case 3:              *to = *from++;
        case 2:              *to = *from++;
        case 1:              *to = *from++;
                       } while ((count -= 8) > 0);
    }
これ使ってコルーチンやってる人とかいます[1]。で、何が言いたいかという
と、switch は無理にブロックに区切って見ない方がいいんじゃないかというこ
とです。 あえて break を抜かして処理を繋げるのも一般的で、この場合もブ
ロック観は崩れます。御参考までに。


[1] "Coroutines in C" http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html


-- 
Jun Inoue
jun.l****@gmail*****



Anthy-dev メーリングリストの案内
Back to archive index