Grand Central Dispatch のブロックでYコンビネータを書いてみた (2)

前回の続き。

Yコンビネータ再帰することをやめたら効率が上がったと思う

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について、とても参考になりました。