append我常用于连接两个string或者list,其实还可以这样用,将两个list连接成一个lambda表达式:
> (append (lambda (x)) ‘((add x 1))) (lambda (x) (add x 1))
append的第一个参数是(lambda (x)) 一个List,有两个元素,第二个参数也是一个list,子元素也是一个list
拼接后就是变成了一个完整的lambda表达式,接受x为参数,并且能够加1后返回。
进一步考虑, 这里add是写死的,如果现在将(append...)变为某个函数的body,将add作为函数参数传递进来,看看会有什么效果。
> (define (foo op) (append (lambda (x)) (list (list op ‘x 1)))) (lambda (op) (append (lambda (x)) (list (list op ‘x 1)))) > (foo ‘add 2) (lambda (x) (add x 1))
1. 这里用list代替了‘, 因为实际使用中我发现 op参数传递会有问题,用list就好
2. foo函数实际上是一个lambda表达式,函数体是(append...)语句,该函数体在运行时会返回(append...)的结果
也就是(lambda (x) (add x 1))
本文标题是动态函数,其实指的就是参数可以是运算符,这里(foo op) 参数op就是可以为‘add, 所以foo就是动态函数
进一步改进之,可以foo可以接受一个参数p:
> (define (foo op p) (append (lambda (x)) (list (list op p ‘x)))) (lambda (op p) (append (lambda (x)) (list (list op p ‘x))))
原文地址:http://blog.csdn.net/csfreebird/article/details/41855633