lambda 表达式
lambda
表达式与 define
作用类似,可以将表达式抽象为程式,不过无法命名,结构体如下
(lambda (<formal-parameters>) <body>)
lambda
表达式同样可以作为表达式的操作符使用,如下:
((lambda (x y z) (+ x y (sqaure z)))
1 2 3)
let 表达式
let
用于定义局部变量,结构体如下:
(let ((<var1> <exp1>)
(<var2> <exp2>)
...
(<varn> <expn>))
<body>)
其实 let
并不是一种表达式的特殊形式,而是基于 lambda
的语法糖,let
表达式的结构体转换为 lambda
形式如下:
((lambda (<var1> <var2> ... <varn>)
<body>)
<exp1>
<exp2>
...
<expn>)
let
定义的局部变量作用域为 let
表达式体中,于是衍生出下列两条规则:
-
let
仅允许被绑定的变量在此let
表达式体中应用。例如,假设下列表达式中的 x 值为 5,整个表达式的结果为 38。因为在let
体中应用的 x 值为 3,所以let
表达式的结果为 33,而let
表达式外部的 x 依然是 5,所以整个表达式的结果为 38。
(+ (let ((x 3))
(+ x (* x 10)))
x)
-
let
中局部变量值的计算依靠let
外部的变量。也就是说,let
中存在与表达式外部同名的变量,在计算let
中局部变量结果时使用的依然是外部变量。例如,假设下列表达式中 x 的值是 2,整个表达式的结果为 12。因为let
表达式中 x 值为 3,y 的值为 4(计算 y 时使用的 x 值为let
外部的 x 值 2)。
(let ((x 3)
(y (+ x 2)))
(* x y))
高阶程式
高阶程式是指维护通过参数传入的程式或返回结果为程式的程式,这种程式能够进行更高级别的抽象,为编程语言提供强大的表达能力。
通常编程语言的第一公民拥有以下权限:
- 能够命名为变量
- 可以作为参数传递给程式
- 可以作为程式的结果返回
- 能够被包含在数据结构中
加上高阶程式的表述,在 Lisp 中程式便是它的第一公民。
网友评论