3

是否可以创建适用于块范围的函数?如

编辑澄清

enum { cannot, must };
int it(enum modal verb);

describe(fx) {
    context("some context") {
        it(must) { /* Some test that returns an int to it() */ };
    }
}

我怀疑这是可能的,那么我能做的下一件最好的事情是什么?

4

2 回答 2

6

这对我来说几乎就像 Smalltalk 或 Ruby,这让我觉得你想将闭包(有时称为blocks)传递给函数。这可以通过对 C 的各种扩展来实现,并且还有一些变通方法。

例如,也许你想遍历一个列表:

{
    // this does not actually work, sorry
    iterate(list) { |i| -> printf("%d\n", i); }
}

如果您使用 Apple 对 C 的扩展,则可以使用称为“块”的东西

{
    // Apple only
    iterate(list, ^(int i) { printf("%d\n", i); });
}

你也可以写一个回调,

static void my_callback(int i) { printf("%d\n", i); }

...
{
    iterate(list, my_callback);
}

回调不能访问其他函数作用域内的变量,所以你必须想办法共享变量。

GCC中有嵌套函数;这些可以访问范围变量,就像 Apple 的“块”扩展一样。

{
    // GCC only
    void callback(int i) { printf "%d\n", i); }
    iterate(list, callback);
}

如果你发现自己非常想做这件事,你可以通过切换到 C 以外的语言来省去很多麻烦。C 对于高阶编程不是很友好。

于 2012-07-25T06:25:56.227 回答
0

我不确定你想要什么,但也许GCC的嵌套函数扩展可以满足你的需求。请注意,它是一个非标准扩展(并且一些其他编译器不提供它)。

请注意,C 函数(可悲)不是闭包;这是切换到某些函数式语言(如 Ocaml、Haskell、Scheme ...)的原因。

于 2012-07-25T05:59:05.493 回答