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

47

Click here to load reader

Upload: hiro-h

Post on 18-Dec-2014

1.686 views

Category:

Technology


0 download

DESCRIPTION

 

TRANSCRIPT

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

札幌C++勉強会#2

C++のマクロはどこまで関数をいじれるのか

~「Pythonで末尾再帰最適化」問題から~

H.Hiro(Maraigue)Twitter: @h_hiro_

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

自己紹介

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

H.Hiro(Maraigue)

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

H.Hiro( ‿‿ )◕ ◕

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

←これがアイコンです

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

JR由仁駅の近くにあります

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

大学院生(大学9年目)アルゴリズムの開発やってます普段はRubyの人ですでもC++もよく書きます他にはC#とかPythonとかC++は主に研究で利用Boostは全然使えてませんでも使い始めようと思ってます

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

昨日はRuby勉強会で「ぽぽぽぽーん」言いすぎて

すみませんでしたhttp://www.slideshare.net/

maraigue/201172-ruby-rubygems

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

最近、C++を書く機会が増えていて

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

C++でももっと遊びたい

お年頃

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

C++のマクロやテンプレートでもっと遊びたい

お年頃

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

今日はそんな話をしたいと

思います

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

お題

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

末尾再帰最適化

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

って何?

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

関数の再帰呼び出しがその関数の末尾だけに

ある場合にはループに置き換えることで処理効率を良くできること

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

言葉じゃ説明しにくいので

コードお見せしますPython: http://d.hatena.ne.jp/wasabiz/20110118/1295335821

Ruby: http://d.hatena.ne.jp/athos/20110119/p1

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

これの面白いところは

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

関数定義部が普通の再帰のコードなのにdef sum(n, acc=0):

if n == 0:

return acc

else:

return sum(n-1, acc+n)

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

一言付け加えるだけで最適化されちゃったこと@tail_recursive # ←これ!注目!

def sum(n, acc=0):

if n == 0:

return acc

else:

return sum(n-1, acc+n)

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

実用性はないかもしれないけど

ロマンがありますよね!

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

じゃあこれをC++で行うには

どうすればよいか?

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

札幌C++勉強会#2

C++のマクロはどこまで関数をいじれるのか

~「Pythonで末尾再帰最適化」問題から~

H.Hiro(Maraigue)Twitter: @h_hiro_

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

※「コンパイラが最適化してくれるよ」ってツッコミはご遠慮頂けると幸いです

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

理想的には

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

元の関数がこんな感じならlong long sum

(long long count,

long long acc = 0){

if(count == 0) return acc;

return sum(count–1,

acc+count);

}

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

↓これくらい楽に書ければいいよねTCO(long long sum)

(long long count,

long long acc = 0){

if(count == 0) return acc;

return sum(count–1,

acc+count);

}

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

でもたぶん無理!

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

じゃあ、どこまでできるか

やってみよう

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

その前に:C++のマクロの基本

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

#define TRUE 1…update(TRUE);

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

#define TRUE 1…update(TRUE);// ↑コンパイル前に// update(1)に置き換えられる

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

#define HOGE(a, b) (a*b)…HOGE(1+2, 3+4);

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

#define HOGE(a, b) (a*b)…HOGE(1+2, 3+4);// ↑コンパイル前に// HOGE(1+2*3+4)に// 置き換えられる

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

#define HOGE(a, b) (a*b)…HOGE(1+2, 3+4);// ↑コンパイル前に// HOGE(1+2*3+4)に ←あれ?// 置き換えられる

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

#define HOGE(a, b) ((a)*(b))…HOGE(1+2, 3+4);// ↑コンパイル前に// HOGE((1+2)*(3+4))に// 置き換えられる

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

では実際に以下の関数をいじろう

long long sum

(long long count,

long long acc = 0){

if(count == 0) return acc;

return sum(count–1,

acc+count);

}

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

(ここからライブコーディング)

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

ここまでできた!

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

まだうまく出来ないか?

●引数の数によらない表記●「long long, sum」を 「long long sum」と書けないか?

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

Boostだと黒魔術的な

マクロとかテンプレートとか多いので

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

何とか出来るかも…

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

しかし、私はそこまでの知識を

持ち合わせてない><

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

協力求む!

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

(ここからライブコーディング)

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

To BeContinued

(たぶん)

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

ソースコードはこちらhttp://gist.github.com/1062342