119日目 C引数付き置換マクロで作る、擬似timesメソッド(Ruby)

Rubyのtimesメソッドがうらやましくなってマクロで遊んでみました。
Ruby

    3.times {
        puts "hello"
}

C

#include <stdio.h>

#define times(N) for(num = 0; num < N; num++)

int main()
{
    int num;

    times(3)
        printf("hello\n");
    return 0;
}


次に、times(num, 3)と書けば、numを0から1ずつ増やしながら、3になるまで(つまり3回)以下の行を実行するようにしました。
Ruby

3.times {|num|           /* numを0から1ずつ増やしながら */
    puts "num = #{num}"  /* 3になるまで実行する         */ 
}

C

#include <stdio.h>

#define times(M, N) for(M = 0; M < N; M++) 

int main()
{
    int num;

    times(num, 3)         /* numを0から1ずつ増やしながら */
        printf("num = %d\n", num);
    return 0;
}

で、これを使えば回数のみの多重ループの可読性が上がるはず。
くどいようだがループの回数アスタリスク表示をまたやりましたよ。

#include <stdio.h>

#define times(M, N) for(M = 0; M < N; M++) 

int main()
{
    int ast, num;

    times(num, 10) {         /* numを0から1ずつ増やしつつ */
	printf("%d\t", num);     /*  num == 10 になるまで実行 */
	times(ast, num)      /* astを0から1ずつ増やしなつつ */
	    printf("*");         /*  ast == num になるまで実行 */
	printf("\n");
    }
    return 0;
}

マクロ置換前

#include <stdio.h>

int main()
{
    int num, ast;

    for (num = 0; num < 10; num++){    // numを0から1ずつ増やしつつ
        printf("%d\t", num);             // num == 10 になるまで実行
        for (ast = 0; ast < num; ast++)  // astを0から1ずつ増やしなつつ
            printf("*");                    // ast == num になるまで実行
        printf("\n");
    }
    return 0;
}

一度この置換を経験してみると、2種類のfor文の違いがはっきりしていいかも?

参考:102日目 これは遅延評価勉強法なのか - id:wakutekaのプログラミングメモ
ループの回数だけアスタリスクを表示 - yaottiの日記 - ハチロク世代
36日目 K&amp;RのExerciseをやってみた - id:wakutekaのプログラミングメモ


ちなみにRubyだとこうなるかな。

10.times {|num| 
    print "#{num} "
    num.times {|ast|
	print "*"
    }
    print "\n"
}

動作確認はcodepad.orgでやりました。
codepad



追記

10.times { |num| puts "#{num} #{'*' * num}" }
SKSの申し子 on Twitter: "@wakuteka 今更だけど,「ループの回数だけアスタリスクを表示」はこんな感じで行けるかも(Ruby). 10.times { |num| puts "#{num} #{'*' * num}" }"

rubyだとこれでおkだと教えていただきました。