Lisp 入門/第七章 條件操作符

維基教科書,自由的教學讀本

第七章 條件操作符[編輯]

Cond 操作符[編輯]

Cond操作符有些複雜。 它的形式為

(cond 分支列表1 分支列表2 分支列表3 ... 分支列表N)

而其中分支列表的構成為 (條件p 值e)

Cond 操作符將對每一個「條件p」求值,如果為NIL,就接着求下一個,如果為真,就返回相應的「值e」,如果沒有一個真值,cond操作符返回nil。Cond操作符的參數可以不止兩個。

(cond (nil 1) (nil 2) (t 3))

3

(cond (t 1) (nil 2) (t 3))

1

有了cond操作符,我們就相當於擁有了類c語言中的if語句。當然,cond語句比c中的if語句更強大,同時也更難用。在common Lisp中,已經有一個函數if了,它的形式如下 (if 判斷表達式 真值時的返回值 假值時的返回值)


兩個例子[編輯]

現在我們將編一個函數,返回兩個數中的最大值。

在編寫之前,我們要知道,系統已經給我們提供了一個函數,那就是max 。所以我們的函數名字就叫max2,以示區別。

我們依次輸入以下代碼:

>(defun max2 (a b) (cond ((> a b) a) (t b)))

MAX2

>(max2 2 3)

3

Max2的行為分析:當參數a大於參數b時,返回a,如果不滿足此條件,那麼就一定要返回b。

所以,我們的條件是a和b的大小比較,如果為真,則返回a,否則,一定返回b。

當然,這個函數,我們也可以用if函數構造。構造如下:

(defun max2 (a b)
  (if (> a b) a b)
)

我們還可以定義一個求絕對值的函數。

當然,這個函數系統本身也提供。這個函數的行為如下:

>(abs -3)

3

該如何構造呢,顯然,當參數大於0是返回本身,當參數小於0時返回它的相反數。

>(defun abs2 (x) (cond ((> x 0) x) (t (- 0 x))))

ABS2

>(abs2 -3)

3

其中,(- 0 x)表示的意思是 0-x,也就是x的相反數。