2025-10-29 23:41:18 同人作品

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)