Terminator vs separator
まさか今こんなことを気にしている人はいないだろうから書くけど,MinCamlの逐次実行構文においてセミコロンがterminatorでなくseparatorなのが微妙な罠である.S先生にいただいた「コンテスト用」レイトレソースでコンパイルが通らないところがあった.まぁ手でセミコロンを削ればいいし,挙動を変えるにしても1つ余分にnonterminalを導入すればよかろう.
これはPascalと一緒.似た話を昔Delphi使いだったPさんとIRCでしたっけなぁ.懐かしい.
ちなみに私はCの配列を初期化するときにはいつも次のように書く.5の後のカンマね.
int arr[] = {1, 2, 3, 4, 5, };
こんな気遣いのあるCでも,if文あたりで余分に ';' を入れると怒られる.まぁ波括弧を使えばいいのだけど.
if (x > 10) foo(x);; else bar(x);
実はfoo
が複数の文から成るマクロだった... となると話がややこしくなる.そこで do {
... } while (0);
ですか.そしてRubyのソースへ話がつながるわけだ(笑