定义

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内部的实现原理了。




Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐