Common Lisp——List

要理解List关键在于理解构建它的更原始的数据类型,即cons cell。可以通过函数CONS创建它们。

CONS函数需要两个参数,并返回一个新的包含这两个参数的cons cell。CONS的参数可以引用任何类型的数据对象。除第二个参数为NIL或其他cons cell的情况,CONS返回的新的cons cell中的两个值被一个点号所隔开,这样的cons cell被叫做dotted pair。

(cons 1 2) -> (1 . 2)

在一个cons cell中,其第一个值被叫做CAR,第二个值被叫做CDR。

(car (cons 1 2)) -> 1
(cdr (cons 1 2)) -> 2
可以通过SETF来设定CAR或CDR的值。

List就是由一些列被链接在一条链上的cons cell构建的。

(cons 1 nil)                    ; 等价于(list 1)
(cons 1 (cons 2 nil))           ; 等价于(list 1 2)
(cons 1 (cons 2 (cons 3 nil)))  ; 等价于(list 1 2 3)
由上面的例子可以看出,要创建一个类似于(1 2 3)这样的list,使用cons需要关心cons cell链上的每个cons cell细节,比较繁琐,这时可以使用函数LIST来代替CONS。

一个较为复杂的List如下:

(list "foo" (list 1 2) 10) -> ("FOO" (1 2) 10)

可以通过下图来表示上述例子的结构:

"Destructive"操作

由于Lisp的功能传统,修改存在对象的操作被叫做"Destructive"。对于state-modifying操作来说,又可分为for-side-effect和recycling两种截然不同的操作类型。

List操作函数

函数名描述
LAST返回list中最后一个cons cell,如果带有参数N(整数),则返回最后N个cons cell。
BUTLAST返回一个list的copy,这个copy不包含list中的最后一个cons cell。如果带有参数N(整数),则copy不包含最后N个cells。
NBUTLASTBUTLAST的recycling版本,
LDIFF返回给定cons cell的一个copy
TAILP判断一个给定对象是否是指定list的tail。
LIST*Builds a list to hold all but the last of its arguments and then makes the last argument the CDR  of the last cell in the list. In other words, a cross between LIST and APPEND.
MAKE-LISTBuilds an n  item list. The initial elements of the list are  NIL  or the value specified with the :initial-element  keyword argument.
REVAPPENDCombination of REVERSE  and APPEND; reverses first argument as with REVERSE  and then appends the second argument.
NRECONCRecycling version of REVAPPEND ; reverses first argument as if by NREVERSE and then appends the second argument. No reliable side effects.
CONSPPredicate to test whether an object is a cons cell
ATOMPredicate to test whether an object is  not a cons cell
LISTPPredicate to test whether an object is either a cons cell or  NIL
NULLPredicate to test whether an object is  NIL. Functionally equivalent to  NOT  but stylistically preferable when testing for an empty list as opposed to boolean false.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值