DOSEIの日記

技術メモ+日常ログ

途中判定ループ

前判定、後判定ループだけじゃなくて、途中判定ループがあればいいなと思うとき。

先読み処理のループ

#が現れるまで処理。多分次の3つのどれかになる。

  • 1. 2度同じことを書く
c = i.read();
while(c != '#')
{
  o.write(c);
  c = i.read();
}

or

for(c = i.read(); c != '#'; c = i.read())
{
  o.write(c);
}
  • 2. 無限ループ + 脱出
do
{
  c = i.read();
  if(c == '#') break;
  o.write(c);
}
while("infinite loop");
  • 3. 代入の評価値を使う
while((c = i.read()) != '#')
{
  o.write(c);
}

どれもやだ…(´・ω・`)
1 は冗長な感じが嫌。 2 は無限ループが嫌。 3 は代入がステートメント的に扱いたいので嫌。

提案

もし、途中判定ループ loop{A}continue(pred){B}なるものがあれば,

loop
{ // 前処理
  c = i.read();
}
continue(c != '#') // 途中条件(継続判定)
{ // 後処理(継続時のみ)
  o.white(c);
}

と書ける。
私の知らない言語にはこういうのがあるのかなぁ。