摘自 《Lisp语言- 陈光喜》
表达式实例:
>(+ 1 2)
>3
Common Lisp表达式求值规则是:
首先对每个参数从左到右进行求值;
其次将这些已经求值的参数作为运算符函数的参数进行函数调用求值;
所求得的值作为表达式的值返回。
一、Lisp的数据类型
Lisp有其它语言的一切类型,还提供另外其它语言没有两种类型: symbol(符号)和 list(表)。
(1)符号显示时总是被转换为大写。一般要使用 quote 来引用它
>’qwert
QWERT
(2)列表
List(表)是由一对括号包括起来的,括号内有 0 个或多个元素,这些元素可以是任何类型的,也可以是表。要使用 quote 来引用 list,否则它将被 Lisp 求值。
> ‘(1 2 (a b 3) d)
(1 2 (a b 3) d)
也可以使用 list 来建立表:
> (list ‘a ‘b "sin" 1 2)
(A B "sin" 1 2)
>(list ‘(* 2 3) (* 2 3))
((* 2 3) 6)
二、Lisp的7个基本运算符
Lisp的表达式是一个原子(atom)或表(list),原子是一个字母序列,如ab;表是由零个或多个表达式组成的序列,表达式之间用空格分隔开,放入一对括号中。
(1) quote
quote是一个特殊的运算符,可以简写为" ‘ “ ,它的求值规则是什么也不做。通过引用一个表,可以避免它被求值。
> (quote x)
X
> (quote (a b c))
(A B C)
> ‘x
X
> ‘(a b c)
(A B C)
(2) atom
(atom x)返回原子t (或T),如果x的值是一个原子或是空表,否则返回 ()。在Lisp中,() 即空表可表示为()或nil。
>(atom ())
>T
(3)eq
(eq x y) 如果x 和 y 的值是同一个原子或都是空表返回 T , 否则返回空表 () 。
>(eq ‘a ‘a)
>T
>(eq ‘(a b) ‘(a b))
>NIL
注意(eq ‘(a b) ‘(a b)) 会返回NIL , 因为 ‘(a b) 不是原子
(4)car 和 cdr
(car x)要求参数 x 的值是一个表,它返回 x 的第一个元素。
(cdr x) 要求参数 x 的值是一个表,返回 x 的第一个元素之后的所有元素。
> (cdr ‘(a b c))
(b c)
>(car (cdr ‘(a b c)))
b
(5)cons
(cons x y)要求 y 是一个表,它返回一个表,表的第一个元素是 x,其后是 y 中的所有元素。例如:
> (cons ‘1 ‘(2 3))
(1 2 3)
> (cons ‘(a b) ‘(1 2 3))
((A B) 1 2 3)
(6)cond
在 Lisp 中分支条件可由 cond 操作符完成的。Cond 的形式如下:
(cond (p1 e1) (p2 e2)...(pn en))
p1 到 pn 为条件,e1 到 en 为结果,cond 操作符依次对 p1 到 pn 求值,直到找到第一个值为原子 t(真)的p,此时把对应的表达式 e 的值作为整个表达式的值返回。
如:
>(cond ((eq ‘a ‘b) ‘first) ((eq ‘1 ‘1) ‘second))
>SECOND