我知道cddar
表示列表中 first 的 second 的 second ,但是没有第二个2
。这是否意味着2
的第二个是nil
,因为没有一个,或者我做错了这个问题,还是输出了2
?
(cddar '((1 2) 3 (4 5)))
答案 0 :(得分:0)
cddar
与cdr
的{{1}}的{{1}}相同,所以让我们看一下它如何逐步评估:
cdr
所以是,car
/ (cdr (cdr (car '((1 2) 3 (4 5))))) =>
(cdr (cdr '(1 2))) =>
(cdr '(2)) =>
'()
是nil
的结果。而且否,它不是()
。
这是因为每个适当的列表在 cons单元格的第二个插槽中以(cddar '((1 2) 3 (4 5)))
结尾:
(cdr 2)
所以nil
是一个元素的 list 。在 cons cell 的第一个插槽中有(cons 2 '()) =>
(2)
,在第二个插槽中有(2)
。这就是2
是()
的原因。
答案 1 :(得分:0)
您需要查看这些对...它们是:
(cons (cons 1 (cons 2 '()))
(cons 3
(cons (cons 4 (cons 5 '()))
'())))
或以点符号表示:
'((1 . (2 . ())) . (3 . ((4 . (5 . ())) . ())))
当我看到((1 2) 3 (4 5))
时,会看到表示形式中缺少的不可见点和多余的括号。如果.
之后的部分是一对,则可以简化cdr
上的点和一组括号。仅当cdr
上没有括号时,方案才会显示点。像'(4 . 5)
总是这样打印,而'(4 . (5 . ()))
总是在打印中简化为'(4 5)
。只要您不明白,由于列表是虚构的,您将在列表方面遇到困难!对是真正的数据结构。
您要应用cddar
。您只需从右到左执行d
和a
。因此,您想要car
,然后是cdr
,然后是cdr
。使用car
,您选择点的左侧,而使用cdr
,您选择点的右侧。让我们在((1 . (2 . ())) . (3 . ((4 . (5 . ())) . ())))
上进行操作。
((1 . (2 . ())) . (3 . ((4 . (5 . ())) . ())))
car
=> (1 . (2 . ()))
cdr
=> (2 . ())
cdr
=> ()