Grand Central Dispatch のブロックでYコンビネータを書いてみた (2)
前回の続き。
int2int YCombinator(Yfunc f) { printf("Y copy\n"); __block int2int y; y = Block_copy(^(int x) { int2int g = f(y); int val = g(x); Block_release(g); printf("F release\n"); return val; }); return y; }
もっとダイレクトに再帰をしてみた。ほんとに自分自身を呼んで。
そしてここで y の宣言に__blockという修飾子が加わった。え、なぜってこれを入れないと動かなかったから(
・・・本来の目的はブロックの外側のスコープの変数を、書き換えるときにつけるやつらしい。
でも何故だろう?まあ、第一こんな使い方を想定してないだろうし
次の目標はYコンビネータで作ったブロックを呼ぶときに、Block_copyが発生しないことかな。
あと、__blockについてもしっかり調べたい。
id:trashsuite:20100414:1271252150
__blockについて、とても参考になりました。