首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在C中实现惰性求值?

如何在C中实现惰性求值?
EN

Stack Overflow用户
提问于 2009-10-28 16:22:44
回答 7查看 3.7K关注 0票数 18

举个例子,

以下是python代码:

代码语言:javascript
复制
def multiples_of_2():
  i = 0
  while True:
    i = i + 2
    yield i

我们怎么把它翻译成C代码呢?

编辑:我希望将这段python代码翻译成一个类似的C生成器,使用next()函数。我不是在寻找如何在C中创建一个函数来输出2的倍数。2的倍数只是一个例子来说明C中的惰性求值生成器的问题。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-10-28 17:44:32

您可以尝试将其封装在struct

代码语言:javascript
复制
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;
}

然后,您可以使用以下命令定义您的倍数:

代码语言:javascript
复制
int next_multiple(int current) { return 2 + current; }
generator multiples_of_2 = {0, next_multiple};

通过调用以下方法获得下一个倍数

代码语言:javascript
复制
next(&multiples_of_2);
票数 20
EN

Stack Overflow用户

发布于 2009-10-28 16:26:56

我最近在coroutines in C上找到了一篇很好的文章,其中描述了一种这样做的方法。这肯定不是为胆小鬼准备的。

票数 6
EN

Stack Overflow用户

发布于 2009-10-28 17:51:07

如前所述,像python这样的语言负责在生成器的连续调用之间存储堆栈的状态。因为C语言没有这种机制,所以你必须自己去做。正如Greg所指出的,这种“通用”的方式不适合胆小鬼。传统的C语言方式是自己定义和维护状态,并将其传入和传出您的方法。所以:

代码语言:javascript
复制
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);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1635827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档