Python中的迭代器遵循以下模式:调用它们(带参数)并返回一个对象。您反复调用该对象的.next()或.__next__()方法,它将通过迭代器运行。在
我们可以做类似的事情:typedef struct iterator{
int yield_position; /* Where to jump to */
void *yield_state; /* opaque container for local variables */
void *(*next)(iterator*); /* Function taking "this" argument
returning a pointer to whatever we yielded */
} iterator;
iterator *make_generator(/* arguments? */){
iterator *result = malloc(sizeof(iterator)); /* Caller frees */
result->yield_position = 0;
/* Optionally allocate/initialize yield_state here */
result->next = do_generator;
return result;
}
void *do_generator(iterator *this){
struct whatever *result;
switch(this->yield_position){
case 0:
/* Do something */
this->yield_position = 1;
/* Save local variables to this->yield_state if necessary */
return (void *) result;
case 1:
/* Initialize local variables from this->yield_state */
/* Etc.*/
}
}
void free_generator(iterator *iter){
/* Free iter->yield_state if necessary */
free(iter);
}
因为case标签是can be used just about everywhere,所以如果需要,开关应该能够跳到循环的中间。您可能仍然需要重新初始化循环变量等
它的名字是这样的:
^{pr2}$
手工传递this参数会很乏味,因此请定义一个宏:#DEFINE NEXT(iter) ((iter)->next(iter))