lambda 表達(dá)式
lambda
表達(dá)式與 define
作用類似疟暖,可以將表達(dá)式抽象為程式,不過無法命名,結(jié)構(gòu)體如下
(lambda (<formal-parameters>) <body>)
lambda
表達(dá)式同樣可以作為表達(dá)式的操作符使用,如下:
((lambda (x y z) (+ x y (sqaure z)))
1 2 3)
let 表達(dá)式
let
用于定義局部變量勤婚,結(jié)構(gòu)體如下:
(let ((<var1> <exp1>)
(<var2> <exp2>)
...
(<varn> <expn>))
<body>)
其實(shí) let
并不是一種表達(dá)式的特殊形式,而是基于 lambda
的語法糖涤伐,let
表達(dá)式的結(jié)構(gòu)體轉(zhuǎn)換為 lambda
形式如下:
((lambda (<var1> <var2> ... <varn>)
<body>)
<exp1>
<exp2>
...
<expn>)
let
定義的局部變量作用域?yàn)?let
表達(dá)式體中馒胆,于是衍生出下列兩條規(guī)則:
-
let
僅允許被綁定的變量在此let
表達(dá)式體中應(yīng)用。例如凝果,假設(shè)下列表達(dá)式中的 x 值為 5祝迂,整個(gè)表達(dá)式的結(jié)果為 38。因?yàn)樵?let
體中應(yīng)用的 x 值為 3豆村,所以let
表達(dá)式的結(jié)果為 33液兽,而let
表達(dá)式外部的 x 依然是 5骂删,所以整個(gè)表達(dá)式的結(jié)果為 38掌动。
(+ (let ((x 3))
(+ x (* x 10)))
x)
-
let
中局部變量值的計(jì)算依靠let
外部的變量。也就是說宁玫,let
中存在與表達(dá)式外部同名的變量粗恢,在計(jì)算let
中局部變量結(jié)果時(shí)使用的依然是外部變量。例如欧瘪,假設(shè)下列表達(dá)式中 x 的值是 2眷射,整個(gè)表達(dá)式的結(jié)果為 12。因?yàn)?let
表達(dá)式中 x 值為 3佛掖,y 的值為 4(計(jì)算 y 時(shí)使用的 x 值為let
外部的 x 值 2)妖碉。
(let ((x 3)
(y (+ x 2)))
(* x y))
高階程式
高階程式是指維護(hù)通過參數(shù)傳入的程式或返回結(jié)果為程式的程式,這種程式能夠進(jìn)行更高級(jí)別的抽象芥被,為編程語言提供強(qiáng)大的表達(dá)能力欧宜。
通常編程語言的第一公民擁有以下權(quán)限:
- 能夠命名為變量
- 可以作為參數(shù)傳遞給程式
- 可以作為程式的結(jié)果返回
- 能夠被包含在數(shù)據(jù)結(jié)構(gòu)中
加上高階程式的表述,在 Lisp 中程式便是它的第一公民拴魄。