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&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だと教えていただきました。