“foreach”(遍历功能)的C和Lisp实现

 寒假的时候学了一段时间LISP,现在越来越发现其优雅漂亮,

比起命令式的少了许多繁琐。LISP的例子 取自我寒假的一道练习题,没有刻意意把功能做强大。

放出最近在做东西,顺便跟大家交流学习。

LISP版本

;定义了 foreach  这个函数
(define (foreach list action )
        (if(null? list )
           null
         (cons (action (car list)) (foreach (cdr list) action ))
         )   
  )
(display (foreach (list 1 2 3 4 5 ) (lambda (x) (* x x) )));【这一句是输入】

下面是输出

image

再看C语言的版本,这个是近期做的,功能比较强大,当然也就复杂一些,

主要是用来练习函数指针这个知识点和尝试运用函数指针实现抽象化。

C语言版本

/*  
title:函数指针-实现foreach 
create:2011年4月09日6:26下午 
author:aqq 
功能:myforeach 迭代实现容器 
思路: 
1 迭代器foreach(容器,迭代子, ) 
IN:满足某规则的容器 :void *cp=getNext(); 
OUT:遍历单个元素 
2 拦截条件 
3 执行方法 
4 终止条件 
update:2011年4月10日12:28下午 
实现了foreach代码加入了END函数以判断是否该结束 
*/  
static   int  index = 0
void  myforeach( void   *  container 
             ,
void   *  ( * getnext)( void   *    ) 
             ,
bool  ( * Filter)( void   *  ) 
             ,
void  ( * Excute)( void   *
            ,
bool  ( * End)( void   *  ) 
             ){ 
void   *  next = ( * getnext)(container ); 
while ( ( * End)(next) ){ 
    
if ( ( * Filter)( next) ){  // 得到下一个 
         ( * Excute)(next); 
    } 
    next
= ( * getnext)(container ); 
}

void   *  Next( void   *  a ){ 
    
if (index == 4 return  NULL; 
    
else  index ++
    
int    * n = ( int   * )a; 
    printf(
" \n now is %d  \n " , * (n + index)); 
    
return    (n + index); 

bool  Filter( void   *  a){ 
    
return   true

bool  End( void   *  a){ 
    
if (a == NULL)  return   false
    
// int  *n=(int *)a; 
    
// if(*n==NULL) return false; 
   
    
return   true

void  Exc( void   *  number){ 
    
int    * n = ( int   * )number; 
    printf(
"  %d- is -ok-- " , * n ); 

void  functionPointer_e2(){ 
    
int  a[ 5 ] = { 0 , 1 , 2 , 3 , 4 }; 
    
void   *  p = a; 
  
    myforeach(p,Next,Filter,Exc,End); 
}

image

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值