举个例子,
以下是python代码:
def multiples_of_2():
i = 0
while True:
i = i + 2
yield i
我们怎么把它翻译成C代码呢?
编辑:我希望将这段python代码翻译成一个类似的C生成器,使用next()函数。我不是在寻找如何在C中创建一个函数来输出2的倍数。2的倍数只是一个例子来说明C中的惰性求值生成器的问题。
发布于 2009-10-28 17:44:32
您可以尝试将其封装在struct
中
typedef struct s_generator {
int current;
int (*func)(int);
} generator;
int next(generator* gen) {
int result = gen->current;
gen->current = (gen->func)(gen->current);
return result;
}
然后,您可以使用以下命令定义您的倍数:
int next_multiple(int current) { return 2 + current; }
generator multiples_of_2 = {0, next_multiple};
通过调用以下方法获得下一个倍数
next(&multiples_of_2);
发布于 2009-10-28 16:26:56
我最近在coroutines in C上找到了一篇很好的文章,其中描述了一种这样做的方法。这肯定不是为胆小鬼准备的。
发布于 2009-10-28 17:51:07
如前所述,像python这样的语言负责在生成器的连续调用之间存储堆栈的状态。因为C语言没有这种机制,所以你必须自己去做。正如Greg所指出的,这种“通用”的方式不适合胆小鬼。传统的C语言方式是自己定义和维护状态,并将其传入和传出您的方法。所以:
struct multiples_of_two_state {
int i;
/* all the state you need should go in here */
};
void multiples_of_two_init(struct multiples_of_two_state *s) {
s->i = 0;
}
int multiples_of_two_next(struct multiples_of_two_state *s) {
s->i += 2;
return s->i;
}
/* Usage */
struct multiples_of_two_state s;
int result;
multiples_of_two_init(&s);
for (int i=0; i<INFINITY; i++) {
result = multiples_of_two_next(&s);
printf("next is %d", result);
}
https://stackoverflow.com/questions/1635827
复制相似问题