再帰を使うと良い場合もあるよねという話

 続きを書こう。forではループインデックスの更新を行う場所が構文内に用意されているので、それ以外の場所で更新を行うのはイディオムから外れることになり気持ち悪い、という話だった。これを再帰で書くとどうなるか。

 void convertToSVG(point_list, index) {
    if(length (point_list) >= index) {
      return;
    } 
    p = get_point(point_list, index);
    switch(p.type) {
      case angle:
          line_to(point_list, i); convertToSVG(point_list, index + 1); break;
       case bezier:
          curve_to(point_list,i); convertToSVG(point_list, index + 3);
    }

 終了条件をif文で明示するためにちょっと長くなってしまったが、ループインデックスが関数の引数として渡されることにより、インデックス更新が柔軟に行えるようになった。これは定型的なインデックス更新の場合には複数の場所にいちいち同じ事を書かされてウザい、という欠点になりうるが、そういう場合にはそもそもmapとかfor-eachを使うので、大きな問題ではない。Cには無名関数はないけどな。
 しかしC言語にはwhileがある。whileを使えばどうだろうか。whileは継続条件しか書かないので、インデックス更新にいろいろな書き方を使える。これはこれでアリだろう。
 ただ、やはり、whileはwhile(line = fgets(fp) != NULL)みたいにストリームに対して使うものなのではないか、という気もする。

  i=0;
  while(length<i){
   p = get_point(point_list, i);
    switch(p.type) {
      case angle:
          line_to(point_list, i); i++;break;
       case bezier:
          curve_to(point_list,i);i+=3;
    }
  }

みたいなコードは、好きとは言えない。特に、i=0の初期化文には、なんだか哀愁のようなものを感じる。