|
近来对函数式编程非常着迷,我发现许多的EDA脚本语言均支持或有限度的支持函数式的编程风格,比如Cadence SKILL便是LISP的一个变种,
而Agilent ADS的脚本语言AEL也在有限度的支持函数式的编程,比如其内建的针对LIST的操作函数的命名对于一个有LISP的编程经历的人也倍感亲切。
作为练习,我以AEL实现了函数式编程中的一些经典的计算过程如折叠、映射等。
下面是其中一些AEL代码的片断,欢迎斧正。
defun foldl(f, z, xs) {
if (xs == NULL) return z;
else return foldl(f,call(f,list(z,car(xs))),cdr(xs));
}
defun foldr(f, z, xs) {
if (xs == NULL) return z;
else return call(f,list(car(xs), foldr(f, z, cdr(xs))));
}
defun mapcar(f,xs){
if (xs == NULL) return NULL;
else return cons(call(f,list(car(xs))), map(f,cdr(xs)));
}
//zip::[a]->[b]->[[a,b]]
defun zip(xs, ys){
if (xs == NULL) return NULL;
else return cons(list(car(xs),car(ys)),zip(cdr(xs),cdr(ys)));
}
defun plus(x,y) {return x+y;}
defun difference(x,y) {return x-y;}
defun minus(x) {return -x;}
defun times(x,y) {return x*y;}
defun add1(x) {return x+1;}
defun sum(xs) {return foldl(plus, 0, xs);}