Objective-CのBlocksとかいうやつ

404 Blog Not Found:(gc)c – block?それってnested functionで出来るよ!

残念ながらblocksでもnested functionでも、「本当」closureは書けない。というか変数をencloseすることができない。たとえば、以下はsegfaultで落ちてしまう。

Mac持ってないから試せないけど、Objective-Cの(というかappleのCの)独自拡張のblocksはclosureっぽいのでenclose出来るんじゃないですかね。
nested functionは文字通りのnestedなfunctionですが、ざっと仕様眺めた限りではblocksは”inline function”ではなさそう。


typedef int (^fint)();
fint make_incr(__blocks int n) {
return ^{ return n++; };
}

とかやると「mutableなint xを持つfintの子クラス」が返るんじゃないかなぁ。
子…ク…ラス……Objective-Cが拡張で何をやろうと知ったこっちゃないけど、Objective-Cのオブジェクト層ではなくCの層でやられると、何故か妙におぞましいものを感じるなぁ……。
inline functionならなんか許せるのに。なんだろうこの気持ち。
「それC++0xで(ry」だとこんな感じでいいのかな。


#include <stdio.h>
#include <functional>
typedef std::function<int()> fint;
fint make_incr(int n) {
return [=]() { return n++; };
}
int main(int argc, char** argv) {
fint fi = make_incr(0);
fint gi = make_incr(0);
printf("%d\n", fi());
printf("%d\n", fi());
printf("%d\n", fi());
printf("%d\n", gi());
return 0;
}

コンパイラ通す試みすらしてない(というか上記をコンパイルできるコンパイラが手元に一つもないw)ので根本から間違ってるかも。fintをいちいちtypedefとかせずにautoで型推論させても可。
C++0xのラムダはgcc4.5から使えるんだっけかな。今手元にubuntuのgcc4.4.3しかないや……
あれだけ見た目がおぞましいと言われてるC++0xのラムダさんもこう見ると合理的に思えてきて不思議。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です