考虑一个简单的Python函数:
def gen():
for i in range(10):
yield i
是否有可能在C或者C++中实现呢?
在Coroutines in C一文中详细的介绍了在C语言中实现的可能性。
现在简单介绍下:
版本1:
int gen(void) {
static int i, state = 0;
switch (state) {
case 0: goto LABEL0;
case 1: goto LABEL1;
}
LABEL0: /* start of function */
for (i = 0; i < 10; i++) {
state = 1; /* so we will come back to LABEL1 */
return i;
LABEL1:; /* resume control straight after the return */
}
}
版本2:
int gen(void) {
static int i, state = 0;
switch (state) {
case 0: /* start of function */
for (i = 0; i < 10; i++) {
state = 1; /* so we will come back to "case 1" */
return i;
case 1:; /* resume control straight after the return */
}
}
}
版本3:
#define crBegin static int state=0; switch(state) { case 0:
#define crReturn(i,x) do { state=i; return x; case i:; } while (0)
#define crFinish }
int gen(void) {
static int i;
crBegin;
for (i = 0; i < 10; i++)
crReturn(1, i);
crFinish;
}
版本4:
#define crBegin static int state=0; switch(state) { case 0:
#define crReturn(x) do { state=__LINE__; return x; \
case __LINE__:; } while (0)
#define crFinish }
int gen(void) {
static int i;
crBegin;
for (i = 0; i < 10; i++)
crReturn(i);
crFinish;
}
对于C++,在boost库中,有专门的实现:
Boost.Coroutine
该库的部分实现使用了汇编语言。