延迟求值和无穷(4)
发表于 2007-08-15 03:10 AM 作者: liuxinyu
这样,两种record就都能被使用了。测试代码如下:
两段程序都输出:700.如何证明后者的延迟求值真的起作用了呢。可以借助这样的 方法,在stream_record的operator()()中,打印一句标记,例如:“eval”,然后在使 用一个如下的getAt方法,获得第i个纪录。
之后,在上述第二段程序的transform之后,就可以使用getAt连续打印出所有元 素,这时就会发现,getAt求值第一个元素时,后面的元素并没有求值,直到 用getAt求值后面的元素时,它们才真正被求值,如下:
程序输出:
transform over
still empty, eval 1st: 90
1st got
still empty, eval 2nd: 212.5
2nd got
still empty, eval 3rd: 700
代码:
template< typename Record>
void print_rec(Record* r){
if(r){
std::cout<< r->value<<”, ”;
print_rec(r->next());
}
else
std::cout<<” n”;
}
int main(int, char**){
record* r1= new record(90, new record(250, new record(1000, 0)));
record* r2=transform(r1, discount);
record* r3=filter(r2, Greator<double>(500.0));
print_rec(r3);
delete r3;
delete r2;
delete r1;
stream_record* r4= new stream_record(90, new stream_record(250, new stream_record(1000, 0)));
stream_record* r5=transform(r4, discount);
stream_record* r6=filter(r5, Greator<double>(500.0));
print_rec(r6);
delete r6;
delete r5;
delete r4;
} 代码:
template< typename Record>
double getAt(Record* r, int i){
if(i==0)
return (r!=0)? r->value : -1;
else
return getAt(r->next(), i-1);
} 代码:
stream_record* r5=transform(r4, discount); std::cout<<”transform overn”; std::cout<<”1st: ”<<getAt(r5, 0)<<”n”; std::cout<<”1st gotn”; std::cout<<”2nd: ”<<getAt(r5, 1)<<”n”; std::cout<<”2nd gotn”; std::cout<<”3rd: ”<<getAt(r5, 2)<<”n”;
transform over
still empty, eval 1st: 90
1st got
still empty, eval 2nd: 212.5
2nd got
still empty, eval 3rd: 700
评论总数 0
评论
发表评论 |
作者为 liuxinyu 的最新文章
- beautiful code第20章和第29章翻译 (2007-11-06)
- 延迟求值和无穷(6) (2007-08-15)
- 延迟求值和无穷(5) (2007-08-15)
- 延迟求值和无穷(4) (2007-08-15)
- 延迟求值和无穷(3) (2007-08-15)




