append构建动态函数

来源:互联网 发布:尼康软件人像后期 编辑:程序博客网 时间:2024/05/16 02:51

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))))



0 0