lisp中的CDR使用情况

时间:2016-05-17 01:06:18

标签: lisp

是否无法取cdrcdr? 我有这个代码,后两个语句返回一个nil

CL-USER 31 : 1 > (CHOICES 'PANTRY)
((NORTH KITCHEN) (WEST DINING-ROOM))

CL-USER 32 : 1 > (car(CHOICES 'PANTRY))
(NORTH KITCHEN)

CL-USER 33 : 1 > (car(car(CHOICES 'PANTRY)))
NORTH

CL-USER 34 : 1 > (cdr(CHOICES 'PANTRY))
((WEST DINING-ROOM))

CL-USER 35 : 1 > (car(cdr(cdr(CHOICES 'PANTRY))))
NIL

CL-USER 36 : 1 > (cdr(cdr(CHOICES 'PANTRY)))
NIL

在最后两个声明中,我的目标是(DINING-ROOM)结果,它们是我试图获得它的两种不同方式。

2 个答案:

答案 0 :(得分:3)

您应该将car视为first,将cdr视为rest

然后很明显,(second x)(first (rest x))相同,与(car (cdr x))相同,即(cadr x)

这样可能很容易看出,因为

(second (second '((NORTH KITCHEN) (WEST DINING-ROOM))))
==> DINING-ROOM

由于secondcadr相同,因此

(cadr (cadr '((NORTH KITCHEN) (WEST DINING-ROOM))))
==> DINING-ROOM

或者,长话短说:

(cadadr '((NORTH KITCHEN) (WEST DINING-ROOM)))
==> DINING-ROOM

如果您想要列表 (DINING-ROOM),只需删除最后一个a

(cdadr '((NORTH KITCHEN) (WEST DINING-ROOM)))
==> (DINING-ROOM)

请注意,您按照应用程序的顺序删除了 last a,因此它在函数名称中首先

答案 1 :(得分:2)

您有两个元素的列表。

CL-USER 1 > '((NORTH KITCHEN) (WEST DINING-ROOM))
((NORTH KITCHEN) (WEST DINING-ROOM))

CL-USER 2 > (length '((NORTH KITCHEN) (WEST DINING-ROOM)))
2

删除第一个并保留其余部分。现在它的长度为一个

CL-USER 3 > (cdr '((NORTH KITCHEN) (WEST DINING-ROOM)))
((WEST DINING-ROOM))

CL-USER 4 > (length '((WEST DINING-ROOM)))
1

CL-USER 5 > (cdr '((WEST DINING-ROOM)))
NIL

删除第一个并保留其余部分。现在它的长度

CL-USER 6 > (length 'nil)
0

然后:

CL-USER 7 > '((NORTH KITCHEN) (WEST DINING-ROOM))
((NORTH KITCHEN) (WEST DINING-ROOM))

删除第一个元素并保留其余元素。

CL-USER 8 > (cdr '((NORTH KITCHEN) (WEST DINING-ROOM)))
((WEST DINING-ROOM))

你拿第一个元素。

CL-USER 9 > (car '((WEST DINING-ROOM)))
(WEST DINING-ROOM)

删除第一个元素并保留其余元素。

CL-USER 10 > (cdr '(WEST DINING-ROOM))
(DINING-ROOM)

cDr ... cAr ... cDr:我们一起cDADr

CL-USER 11 > (cdadr '((NORTH KITCHEN) (WEST DINING-ROOM)))
(DINING-ROOM)