法楽日記

デジタル散策記&マインド探訪記

clang の無名関数

clang拡張機能 block を用いると無名関数が書けるのですね。Apple による拡張だそうです。

下記で、関数 call1() の第1引数は関数へのポインタを取り、関数 call2() の第1引数は block を取ります。前置演算子「^」が絶妙な働きをしています。このように名前のない block を使うと、ラムダ式のように利用することができます。前置演算子「^」はよく見ると大文字のラムダ「Λ」に似ています(小文字ラムダ「λ」にも少し似てます)。

#include <stdio.h>

static void
call1(int a, int b, void(*func)(int, int))
{
    (*func)(a, b);
}

static void
call2(int a, int b, void(^func)(int, int))
{
    func(a, b);
}

static void
calc1(int a, int b)
{
    printf("%d * %d = %d\n", a, b, a * b);
}

int
main(int argc, char **argv)
{
    /* Print: 7 * 2 = 14 */
    call1(7, 2, calc1);

    /* Print: 5 ^ 3 = 6 */
    call2(5, 3, ^(int a, int b){ printf("%d ^ %d = %d\n", a, b, a ^ b); });

    /* Print: 3 ^ 4 = 7 */
    ^(int a, int b){ printf("%d ^ %d = %d\n", a, b, a ^ b); }(3, 4);

    return 0;
}

次のように出力されます。

7 * 2 = 14
5 ^ 3 = 6
3 ^ 4 = 7

《参考文献》