C语言中的Python风格迭代器
python中的“yield”语句允许从过程进行简单的迭代,也意味着序列不需要预先计算并存储在“任意”大小的数组中C语言中的Python风格迭代器,python,c,iterator,jit,algol68,Python,C,Iterator,Jit,Algol68,python中的“yield”语句允许从过程进行简单的迭代,也意味着序列不需要预先计算并存储在“任意”大小的数组中 有没有类似的方法从C过程中进行迭代(使用yield)?我不时地把这个URL作为一个笑话拉出来: 我认为对你的问题的正确答案是:没有直接的等价物,试图伪造它可能不会那么干净或易于使用。没有 又好又短 下面是一个社区维基版的自我回答,可以选择它作为“答案”。请直接向上/向下投票至实际的自我回答 以下是我找到的方法: /* Example calculates the sum o
有没有类似的方法从C过程中进行迭代(使用yield)?我不时地把这个URL作为一个笑话拉出来: 我认为对你的问题的正确答案是:没有直接的等价物,试图伪造它可能不会那么干净或易于使用。没有 又好又短 下面是一个社区维基版的自我回答,可以选择它作为“答案”。请直接向上/向下投票至实际的自我回答 以下是我找到的方法:
/* Example calculates the sum of the prime factors of the first 32 Fibonacci numbers */
#include <stdio.h>
typedef enum{false=0, true=1}bool;
/* the following line is the only time I have ever required "auto" */
#define FOR(i,iterator) auto bool lambda(i); yield_init = (void *)λ iterator; bool lambda(i)
#define DO {
#define YIELD(x) if(!yield(x))return
#define BREAK return false
#define CONTINUE return true
#define OD CONTINUE; }
/* Warning: _Most_ FOR(,){ } loops _must_ have a CONTINUE as the last statement.
* * Otherwise the lambda will return random value from stack, and may terminate early */
typedef void iterator; /* hint at procedure purpose */
static volatile void *yield_init;
#define YIELDS(type) bool (*yield)(type) = yield_init
iterator fibonacci(int n){
YIELDS(int);
int i;
int pair[2] = {0,1};
YIELD(0); YIELD(1);
for(i=2; i<n; i++){
pair[i%2] = pair[0] + pair[1];
YIELD(pair[i%2]);
}
}
iterator factors(int n){
YIELDS(int);
int i;
for(i=2; i*i<=n; i++){
while(n%i == 0 ){
YIELD(i);
n/=i;
}
}
YIELD(n);
}
main(){
FOR(int i, fibonacci(32)){
printf("%d:", i);
int sum = 0;
FOR(int factor, factors(i)){
sum += factor;
printf(" %d",factor);
CONTINUE;
}
printf(" - sum of factors: %d\n", sum);
CONTINUE;
}
}
/*示例计算前32个斐波那契数的素因子之和*/
#包括
typedef枚举{false=0,true=1}bool;
/*下面这行是我唯一一次需要“自动”*/
#定义(i,迭代器)自动布尔lambda(i);收益率_init=(void*)&lambda;迭代器;布尔·兰姆达(一)
#定义DO{
#如果(!收益率(x))返回,则定义收益率(x)
#定义中断返回false
#定义继续返回true
#定义OD CONTINUE;}
/*警告:_Most_uuufor(,){}循环u必须将CONTINUE作为最后一条语句。
**否则lambda将从堆栈返回随机值,并可能提前终止*/
typedef无效迭代器;/*暗示程序目的*/
静态挥发性空隙率*yield_init;
#定义收益率(类型)布尔(*收益率)(类型)=收益率
迭代器斐波那契(int n){
收益率(整数);
int i;
int对[2]={0,1};
收益率(0);收益率(1);
对于(i=2;我问这个问题有什么意义?你只是想自己回答这个问题来提高你的评分?它昨天在Reddit上,所以我不认为这是巧合。所以你的问题得到-1,我的答案得到-1。你应该只在这么短的时间问问题。我感谢你打算分享知识,但像Reddit这样的地方和Digg更适合这样做。我将撤销我的反对票,因为你的错误是无意的。@qrdl这是很久以前处理的()NevilleDNZ的行为不仅是可以接受的,而且是值得鼓励的。你甚至可以得到一个徽章,因为你自己的问题的答案获得了3张赞成票。这是一个问答的地方,一个人同时提供这两个答案的事实不值得小看。每当我发现这种情况,我都会将自我答案复制粘贴到社区维基上自有答案,可选择为“该”答案(因为问题已被回答)。这看起来非常棒,但是有没有解释它是如何工作的。我对整个auto bool lambda语句感到非常困惑。好的,没关系。我想我理解了。基本上,它将实际循环声明为函数进行迭代,然后在迭代器函数中调用该函数。