返回   cpper编程论坛 > Blog > liuxinyu
注册账号 论坛帮助 会员列表 日历事件 搜索 今日新帖 标记版面已读

为这篇文章评分

延迟求值和无穷(4)

发表于 2007-08-15 03:10 AM 作者: liuxinyu
这样,两种record就都能被使用了。测试代码如下:

代码:
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; 
}
两段程序都输出:700.如何证明后者的延迟求值真的起作用了呢。可以借助这样的 方法,在stream_record的operator()()中,打印一句标记,例如:“eval”,然后在使 用一个如下的getAt方法,获得第i个纪录。
代码:
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); 
}
之后,在上述第二段程序的transform之后,就可以使用getAt连续打印出所有元 素,这时就会发现,getAt求值第一个元素时,后面的元素并没有求值,直到 用getAt求值后面的元素时,它们才真正被求值,如下:
代码:
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 Email文章
评论总数 0

评论

发表评论 发表评论
作者为 liuxinyu 的最新文章

所有时间均为格林尼治时间 +9。现在的时间是 09:30 PM


Powered by vBulletin® 版本 3.7.0
版权所有 ©2000 - 2009,Jelsoft Enterprises Ltd.
(C) Copy Right All Right Reserved 2001 - 2007

Search Engine Friendly URLs by vBSEO 3.1.0