2011.7.3 札幌c++勉強会#2「c++のマクロはどこまで関数をいじれるのか」
DESCRIPTION
TRANSCRIPT
札幌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/1295335821
Ruby: http://d.hatena.ne.jp/athos/20110119/p1
これの面白いところは
関数定義部が普通の再帰のコードなのに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 sum(n-1, acc+n)
実用性はないかもしれないけど
ロマンがありますよね!
じゃあこれを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,
acc+count);
}
↓これくらい楽に書ければいいよねTCO(long long sum)
(long long count,
long long acc = 0){
if(count == 0) return acc;
return sum(count–1,
acc+count);
}
でもたぶん無理!
じゃあ、どこまでできるか
やってみよう
その前に: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,
acc+count);
}
(ここからライブコーディング)
ここまでできた!
まだうまく出来ないか?
●引数の数によらない表記●「long long, sum」を 「long long sum」と書けないか?
Boostだと黒魔術的な
マクロとかテンプレートとか多いので
何とか出来るかも…
しかし、私はそこまでの知識を
持ち合わせてない><
協力求む!
(ここからライブコーディング)
To BeContinued
(たぶん)
ソースコードはこちらhttp://gist.github.com/1062342