Lisp函數(shù)的表示
本文是paul graham所著的《Lisp之根源》的第二部分,介紹了Lisp函數(shù)的表示(***部分)。有關(guān)Lisp函數(shù)表示的具體描述如下:
函數(shù)的表示
接著我們定義一個記號來描述函數(shù).函數(shù)表示為(lambda ( ... ) e ),其中 ... 是原子(叫做參數(shù) ),e 是表達式. 如果表達式的***個元素形式如上
- ((lambda ( ... ) e ) ... )
則稱為函數(shù)調(diào)用 .它的值計算如下.每一個表達式 先求值,然后e 再求值.在e 的求值過程中,每個出現(xiàn)在e 中的 的值是相應(yīng)的 在最近一次的函數(shù)調(diào)用中的值.
- > ((lambda (x) (cons x '(b))) 'a)
- (a b)
- > ((lambda (x y) (cons x (cdr y)))
- 'z
- '(a b c))
- (z b c)
如果一個表達式的***個元素f 是原子且f 不是原始操作符
- (f ... )
并且f 的值是一個函數(shù)(lambda ( ... )),則以上表達式的值就是
- ((lambda ( ... ) e ) ... )
的值. 換句話說,參數(shù)在表達式中不但可以作為自變量也可以作為操作符使用:
- > ((lambda (f) (f '(b c)))
- '(lambda (x) (cons 'a x)))
- (a b c)
有另外一個函數(shù)記號使得函數(shù)能提及它本身,這樣我們就能方便地定義遞歸函數(shù).3 記號
- (label f (lambda ( ... ) e ))
表示一個象(lambda ( ... ) e )那樣的函數(shù),加上這樣的特性: 任何出現(xiàn)在e 中的f 將求值為此label表達式, 就好象f 是此函數(shù)的參數(shù).
假設(shè)我們要定義函數(shù)(subst x y z ), 它取表達式x ,原子y 和表z 做參數(shù),返回一個象z 那樣的表, 不過z 中出現(xiàn)的y (在任何嵌套層次上)被x 代替.
- > (subst 'm 'b '(a b (a b c) d))
- (a m (a m c) d)
我們可以這樣表示此函數(shù)
- (label subst (lambda (x y z)
- (cond ((atom z)
- (cond ((eq z y) x)
- ('t z)))
- ('t (cons (subst x y (car z))
- (subst x y (cdr z)))))))
我們簡記f =(label f (lambda ( ... ) e ))為
(defun f ( ... ) e )
于是
- (defun subst (x y z)
- (cond ((atom z)
- (cond ((eq z y) x)
- ('t z)))
- ('t (cons (subst x y (car z))
- (subst x y (cdr z))))))
偶然地我們在這兒看到如何寫cond表達式的缺省子句. ***個元素是't的子句總是會成功的. 于是
- (cond (x y ) ('t z ))
等同于我們在某些語言中寫的
- if x then y else z
對Lisp函數(shù)的表示便介紹到這里。
【編輯推薦】