Common Lisp SBCL 快速教程
5. 列表操作
列表是Lisp中最基本的数据结构,Lisp这个名字本身就来源于"LISt Processing"(列表处理)。Common Lisp提供了丰富的列表操作函数。
基本列表操作
cons函数
cons函数用于构造列表,它接受两个参数:一个元素和一个列表,返回一个新列表,其中第一个参数是列表的第一个元素,第二个参数是列表的剩余部分。
(cons 'a '(b c d)) ; 返回 (A B C D)
(cons 'a '()) ; 返回 (A)
(cons 'a nil) ; 返回 (A)
car和cdr函数
car函数返回列表的第一个元素,cdr函数返回除第一个元素外的剩余部分。
(car '(a b c d)) ; 返回 A
(cdr '(a b c d)) ; 返回 (B C D)
注意:car和cdr的名称来源于历史原因,分别是"Contents of the Address part of the Register"和"Contents of the Decrement part of the Register"的缩写。现代Lisp实现中也提供了更直观的别名:first(对应car)和rest(对应cdr)。
组合使用car和cdr
可以组合使用car和cdr,形成如cadr、cddr等函数:
(cadr '(a b c d)) ; 等同于 (car (cdr '(a b c d))),返回 B
(cddr '(a b c d)) ; 等同于 (cdr (cdr '(a b c d))),返回 (C D)
(caddr '(a b c d)) ; 等同于 (car (cdr (cdr '(a b c d)))),返回 C
列表构造函数
list函数
list函数接受任意数量的参数,返回一个包含这些参数的列表:
(list 'a 'b 'c 'd) ; 返回 (A B C D)
(list 1 2 3 4) ; 返回 (1 2 3 4)
append函数
append函数将多个列表连接成一个列表:
(append '(a b) '(c d)) ; 返回 (A B C D)
(append '(a b) '(c d) '(e)) ; 返回 (A B C D E)
列表访问函数
nth函数
nth函数访问列表中的第n个元素(从0开始计数):
(nth 0 '(a b c d)) ; 返回 A
(nth 2 '(a b c d)) ; 返回 C
first, second, third等函数
Common Lisp提供了一系列函数来访问列表的前几个元素:
(first '(a b c d)) ; 返回 A
(second '(a b c d)) ; 返回 B
(third '(a b c d)) ; 返回 C
(fourth '(a b c d)) ; 返回 D
列表映射函数
mapcar函数
mapcar函数将一个函数应用到列表的每个元素,并返回结果列表:
(mapcar #'(lambda (x) (* x x)) '(1 2 3 4 5)) ; 返回 (1 4 9 16 25)
(mapcar #'list '(a b c) '(1 2 3)) ; 返回 ((A 1) (B 2) (C 3))
maplist函数
maplist函数类似于mapcar,但它将函数应用到列表的连续cdr上:
(maplist #'(lambda (x) x) '(a b c)) ; 返回 ((A B C) (B C) (C))
列表搜索函数
member函数
member函数在列表中搜索一个元素,如果找到,返回从该元素开始的子列表;否则返回nil:
(member 'b '(a b c d)) ; 返回 (B C D)
(member 'e '(a b c d)) ; 返回 NIL
find函数
find函数在列表中搜索满足条件的元素,如果找到,返回该元素;否则返回nil:
(find 'b '(a b c d)) ; 返回 B
(find-if #'evenp '(1 2 3 4 5)) ; 返回 2
列表过滤函数
remove-if函数
remove-if函数移除列表中满足条件的元素:
(remove-if #'evenp '(1 2 3 4 5)) ; 返回 (1 3 5)
remove-if-not函数
remove-if-not函数保留列表中满足条件的元素:
(remove-if-not #'evenp '(1 2 3 4 5)) ; 返回 (2 4)
列表归约函数
reduce函数
reduce函数将一个二元函数应用到列表的元素上,从左到右归约列表:
(reduce #'+ '(1 2 3 4 5)) ; 返回 15 (1+2+3+4+5)
(reduce #'* '(1 2 3 4 5)) ; 返回 120 (1*2*3*4*5)