newlisp的lambda表达式
定义lambda表达式指的是一个匿名函数,可以将之作为参数传递给map等容器,然后被容器内部调用之。newlisp的官方文档在这里:http://www.newlisp.org/downloads/manual_frame.html缩写参考lambda一节,说其和fn相同,fn是其更方便的简写。下面的两个例子分别使用了lambda和fn,效果完全一样。它们都对map中的list做了加法操作。> (
·
定义
lambda表达式指的是一个匿名函数,可以将之作为参数传递给map等容器,然后被容器内部调用之。
newlisp的官方文档在这里:http://www.newlisp.org/downloads/manual_frame.html
缩写
参考lambda一节,说其和fn相同,fn是其更方便的简写。下面的两个例子分别使用了lambda和fn,效果完全一样。它们都对map中的list做了加法操作。
> (map (lambda (x) (+ x x)) '(1 2 3 4 5))
(2 4 6 8 10)
> (map (fn (x) (+ x x)) '(1 2 3 4 5))
(2 4 6 8 10)
define内部使用lambda表达式
而有名称的函数使用define进行定义,其内部也实际上使用了lambda表达式。下面的例子可以说明这点:
> (define (square x) (* x x))
(lambda (x) (* x x))
只是这个lambda有了一个symbol-- square,方便日后引用。
因此我们以后可以在任何地方通过square来调用该lambda表达式。
> (square 7)
49
检测是否为lambda表达式
现在可以通过lambda?来检测是不是lambda表达式:> (lambda? square)
true
把lambda表达式看作list
作为数据看待
lambda表达式是可以运行的list,同时也是数据,可以向操作list一样提取其中的元素,比如:
> (define (sq x) (* x x))
(lambda (x) (* x x))
> (first sq)
(x)
> (rest sq)
((* x x))
lambda是list的属性而不是元素
注意,‘元素’ lambda是取不到的,first只能取到lambda之后的那个。因此lambda不是list中的元素,而是属性。官方文档这样解释:
lambda in newLISP is not an operator or symbol, but rather a special s-expression or list attribute:
(first double) → (x) ; not lambda
append给list设置lambda属性
我们可以用append给一个list赋予lambda属性。比如:> (append (lambda) '((x) (+ 1 x)))
(lambda (x) (+ 1 x))
>
这里'((x)...))) 是一个list,通过append将lambda添加为其属性,因此变成了lambda表达式。
set结合append就是define
我们进一步,通过set赋给一个symbol,然后运行它。
> (set 'ad (append (lambda) '((x) (+ 1 x))))
(lambda (x) (+ 1 x))
> (ad 5)
6
此时,和define的功能完全相同。因此可以理解define内部的实现原理了。
更多推荐
已为社区贡献30条内容
所有评论(0)