寒假的时候学了一段时间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) )));【这一句是输入】
下面是输出
再看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); }
延伸阅读
- 2011-3-12-- 二叉树遍历递归,二叉树的非递归遍历
- 2011-1-4-- 二叉树,二叉树学习笔记
- 2010-12-9-- 图的遍历,php is_file()和is_dir()用于遍历目录时用法注意事项
- 2011-3-27-- 二叉树遍历,datatable 遍历
- 2011-2-14-- 二叉树遍历,已知某二叉树的某两种遍历序列,求另一种遍历序列面试题解法总结(转)
- 2010-12-13-- 二叉树的遍历算法,数据结构与算法回顾之二叉树的遍历(下)
- 2010-11-24-- 遍历枚举,.NET中的static变量 枚举遍历
- 2011-1-16-- js遍历控件,使用EnumChildWindows函数遍历窗体上所有控件
- 2010-11-24-- 图的遍历,如何对memcache的数据(key-value)进行遍历操作
- 2011-4-12-- 二叉树遍历,如果Google面试让你用python写一个树的遍历程序
最新评论