札幌C++勉強会#2 C++のマクロはどこまで  関数をいじれるのか~「Pythonで末尾再帰最適化」問題から~              H.Hiro(Maraigue)             Twitter: @h_hiro_
自己紹介
H.Hiro(Maraigue)
H.Hiro(◕‿‿◕)
←これがアイコンです
JR由仁駅の近くにあります
大学院生(大学9年目)アルゴリズムの開発やってます普段はRubyの人ですでもC++もよく書きます他にはC#とかPythonとかC++は主に研究で利用Boostは全然使えてませんでも使い始めようと思ってます
昨日はRuby勉強会で「ぽぽぽぽーん」言いすぎて   すみませんでした  http://www.slideshare.net/maraigue/201172-ruby-rubygems
最近、C++を 書く機会が 増えていて
C++でももっと遊びたい  お年頃
C++のマクロやテンプレートでもっと遊びたい   お年頃
今日はそんな話をしたいと 思います
お題
末尾再帰最適化
って何?
関数の再帰呼び出しが その関数の末尾だけに   ある場合にはループに置き換えることで処理効率を良くできること
言葉じゃ説明       しにくいので     コードお見せしますPython: http://d.hatena.ne.jp/wasabiz/20110118/1295335821Ruby: http://d.hatena.ne.jp/atho...
これの面白いところは
関数定義部が普通の再帰のコードなのにdef sum(n, acc=0):    if n == 0:        return acc    else:        return sum(n-1, acc+n)
一言付け加えるだけで最適化されちゃったこと@tail_recursive # ←これ!注目!def sum(n, acc=0):    if n == 0:        return acc    else:        return su...
実用性はないかもしれないけど    ロマンが  ありますよね!
じゃあこれを C++で行うにはどうすればよいか?
札幌C++勉強会#2 C++のマクロはどこまで  関数をいじれるのか~「Pythonで末尾再帰最適化」問題から~              H.Hiro(Maraigue)             Twitter: @h_hiro_
※「コンパイラが最適化してくれるよ」ってツッコミは ご遠慮頂けると幸いです
理想的には
元の関数がこんな感じならlong long sum(long long count,long long acc = 0){    if(count == 0) return acc;    return sum(count–1,        ...
↓これくらい楽に書ければいいよねTCO(long long sum)(long long count,long long acc = 0){    if(count == 0) return acc;    return sum(count–1...
でもたぶん無理!
じゃあ、どこまで  できるか やってみよう
その前に:C++のマクロの基本
#define TRUE 1…update(TRUE);
#define TRUE 1…update(TRUE);// ↑コンパイル前に// update(1)に置き換えられる
#define HOGE(a, b) (a*b)…HOGE(1+2, 3+4);
#define HOGE(a, b) (a*b)…HOGE(1+2, 3+4);// ↑コンパイル前に// HOGE(1+2*3+4)に// 置き換えられる
#define HOGE(a, b) (a*b)…HOGE(1+2, 3+4);// ↑コンパイル前に// HOGE(1+2*3+4)に ←あれ?// 置き換えられる
#define HOGE(a, b) ((a)*(b))…HOGE(1+2, 3+4);// ↑コンパイル前に// HOGE((1+2)*(3+4))に// 置き換えられる
では実際に以下の関数をいじろうlong long sum(long long count,long long acc = 0){    if(count == 0) return acc;    return sum(count–1,     ...
(ここからライブコーディング)
ここまでできた!
まだうまく    出来ないか?● 引数の数によらない表記● 「long long, sum」を  「long long sum」と書けないか?
Boostだと   黒魔術的なマクロとかテンプレート  とか多いので
何とか出来るかも…
しかし、私は そこまでの知識を持ち合わせてない><
協力求む!
(ここからライブコーディング)
To BeContinued  (たぶん)
ソースコードはこちらhttp://gist.github.com/1062342
Upcoming SlideShare
Loading in …5
×

2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」

2,122 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,122
On SlideShare
0
From Embeds
0
Number of Embeds
328
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」

  1. 1. 札幌C++勉強会#2 C++のマクロはどこまで 関数をいじれるのか~「Pythonで末尾再帰最適化」問題から~ H.Hiro(Maraigue) Twitter: @h_hiro_
  2. 2. 自己紹介
  3. 3. H.Hiro(Maraigue)
  4. 4. H.Hiro(◕‿‿◕)
  5. 5. ←これがアイコンです
  6. 6. JR由仁駅の近くにあります
  7. 7. 大学院生(大学9年目)アルゴリズムの開発やってます普段はRubyの人ですでもC++もよく書きます他にはC#とかPythonとかC++は主に研究で利用Boostは全然使えてませんでも使い始めようと思ってます
  8. 8. 昨日はRuby勉強会で「ぽぽぽぽーん」言いすぎて すみませんでした http://www.slideshare.net/maraigue/201172-ruby-rubygems
  9. 9. 最近、C++を 書く機会が 増えていて
  10. 10. C++でももっと遊びたい お年頃
  11. 11. C++のマクロやテンプレートでもっと遊びたい お年頃
  12. 12. 今日はそんな話をしたいと 思います
  13. 13. お題
  14. 14. 末尾再帰最適化
  15. 15. って何?
  16. 16. 関数の再帰呼び出しが その関数の末尾だけに ある場合にはループに置き換えることで処理効率を良くできること
  17. 17. 言葉じゃ説明 しにくいので コードお見せしますPython: http://d.hatena.ne.jp/wasabiz/20110118/1295335821Ruby: http://d.hatena.ne.jp/athos/20110119/p1
  18. 18. これの面白いところは
  19. 19. 関数定義部が普通の再帰のコードなのにdef sum(n, acc=0): if n == 0: return acc else: return sum(n-1, acc+n)
  20. 20. 一言付け加えるだけで最適化されちゃったこと@tail_recursive # ←これ!注目!def sum(n, acc=0): if n == 0: return acc else: return sum(n-1, acc+n)
  21. 21. 実用性はないかもしれないけど ロマンが ありますよね!
  22. 22. じゃあこれを C++で行うにはどうすればよいか?
  23. 23. 札幌C++勉強会#2 C++のマクロはどこまで 関数をいじれるのか~「Pythonで末尾再帰最適化」問題から~ H.Hiro(Maraigue) Twitter: @h_hiro_
  24. 24. ※「コンパイラが最適化してくれるよ」ってツッコミは ご遠慮頂けると幸いです
  25. 25. 理想的には
  26. 26. 元の関数がこんな感じならlong long sum(long long count,long long acc = 0){ if(count == 0) return acc; return sum(count–1, acc+count);}
  27. 27. ↓これくらい楽に書ければいいよねTCO(long long sum)(long long count,long long acc = 0){ if(count == 0) return acc; return sum(count–1, acc+count);}
  28. 28. でもたぶん無理!
  29. 29. じゃあ、どこまで できるか やってみよう
  30. 30. その前に:C++のマクロの基本
  31. 31. #define TRUE 1…update(TRUE);
  32. 32. #define TRUE 1…update(TRUE);// ↑コンパイル前に// update(1)に置き換えられる
  33. 33. #define HOGE(a, b) (a*b)…HOGE(1+2, 3+4);
  34. 34. #define HOGE(a, b) (a*b)…HOGE(1+2, 3+4);// ↑コンパイル前に// HOGE(1+2*3+4)に// 置き換えられる
  35. 35. #define HOGE(a, b) (a*b)…HOGE(1+2, 3+4);// ↑コンパイル前に// HOGE(1+2*3+4)に ←あれ?// 置き換えられる
  36. 36. #define HOGE(a, b) ((a)*(b))…HOGE(1+2, 3+4);// ↑コンパイル前に// HOGE((1+2)*(3+4))に// 置き換えられる
  37. 37. では実際に以下の関数をいじろうlong long sum(long long count,long long acc = 0){ if(count == 0) return acc; return sum(count–1, acc+count);}
  38. 38. (ここからライブコーディング)
  39. 39. ここまでできた!
  40. 40. まだうまく 出来ないか?● 引数の数によらない表記● 「long long, sum」を 「long long sum」と書けないか?
  41. 41. Boostだと 黒魔術的なマクロとかテンプレート とか多いので
  42. 42. 何とか出来るかも…
  43. 43. しかし、私は そこまでの知識を持ち合わせてない><
  44. 44. 協力求む!
  45. 45. (ここからライブコーディング)
  46. 46. To BeContinued (たぶん)
  47. 47. ソースコードはこちらhttp://gist.github.com/1062342

×