(quote x)返回x,我们简记为'x
(atom x)当x是一个原子或者空表时返回原子t,否则返回空表()。在Lisp中我们习惯用原子t表示真,而用空表()表示假。
> (atom 'a)
t
> (atom '(a b c))
()
> (atom '())
t
> (eq 'a 'a)
t
> (eq 'a 'b)
()
> (eq '() '())
t
(car x)要求x是一个表,它返回x中的第一个元素,例如:
> (car '(a b))
a
(cdr x)同样要求x是一个表,它返回x中除第一个元素之外的所有元素组成的表,例如:
> (cdr '(a b c))
(b c)
(cons x y)要求y是一个表,它返回一个表,这个表的第一个元素是x,其后是y中的所有元素,例如:
> (cons 'a '(b c))
(a b c)
> (cons 'a (cons 'b (cons 'c ())))
(a b c)
构成程序逻辑的一个基本功能……条件分支,在Lisp中,它是由cond操作符完成的
(cond (p1 e1) (p2 e2)...(pn en))
p1到pn为条件,e1到en为结果,cond操作符依次对p1到pn求值,直到找到第一个值为原子t(还
记得吗?)的p,此时把对应的e作为整个表达式的值返回,例如:
> (cond ((eq 'a 'b) 'first) ((atom 'a) 'second))
second
(lambda (p1 p2 ... pn) e)
其中,pi为原子,在函数中称之为参数,e是表达式,也就是函数体。
调用一个函数的方式如下:
((lambda (p1 p2 ... pn) e) a1 a2 ... an)
其中ai为表达式,按照我们的惯例,称之为实参。
取第二个元素
(car (cdr x))
可简写成
> (cadr '((a b) (c d) e))
(c d)
取第三个元素
(car (cdr (cdr x)))
可简写成
>(caddr '((a b) (c d) e))
e
使用(list e1 e2 ... en)来表示 (cons e1 (cons e2 (... (cons en '())...)))
> (cons 'a (cons 'b (cons 'c '())))
(a b c)
> (list 'a 'b 'c)
(a b c)
(null x),测试x是否为空表。例如:
> (null 'a)
()
> (null '())
t
(and x y),逻辑与,当且仅当x和y都不是空表时返回't,否则返回空表。
> (and 'a 'b)
t
> (and (atom 'a) (eq 'b 'c))
()
(not x),逻辑非,当x是空表时返回't,否则返回空表。(有人问我or在哪儿?)例如:
> (not 'a)
()
> (not (eq 'a 'b))
t
(append x y),连接两个表x和y,注意它与cons和list之间的不同之处。例如:
> (append '(a b) '(c d))
(a b c d)
> (append '() '(x y))
(x y)
(pair x y),这里x和y是两个长度相同的表,pair生成一个表,其中每个元素是x和y中相应位置上的元
素组成的一个元素对,这个函数的返回值类似于其它语言中的map或dictionary的概念。例如:
> (pair '(a b c) '(x y z))
((a x) (b y) (c z))
(assoc x y),其中x是一个原子,y是一个形如pair所返回的表,assoc在y中查找第一个左元素为x的
元素对并返回。例如:
> (assoc 'a '((a x) (b y)))
x
> (assoc 'a '((a (foo bar)) (b y) (c z)))
(foo bar)
(subst x y z),在表z中将任意层次上出现的原子y都替换为表达式x。例如:
> (subst '(x y) 'b '(a b (a b c) d))
(a (x y) (a (x y) c) d)