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语句。

现在我们将编一个函数,返回两个数中的最大值。

在编写之前,我们要知道,系统已经给我们提供了一个函数,那就是max 。所以我们的函数名字就叫max2。

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

(max2 2 3)

3

有了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的相反数。