方案说明 - cdr和汽车

时间:2014-12-16 11:52:53

标签: scheme

我有这个例子:

(apply + 2 (cdadr '(1 ((2 . 3) 4))))

这会返回6?为什么(cdadr '(1 ((2 . 3) 4))) 4 ?? 我不明白。它不是3?

2 个答案:

答案 0 :(得分:1)

列表(a b c)是(a。(b。(c。())))的缩写。 因此'(1((2.3)4)))是'(1((2.3)。(4。()))。())的缩写。

为了确保,我们在REPL中测试它:

> ''(1 ((2 . 3) . (4 . ())) . ())
'(1 ((2 . 3)) 4)

cdadr(cdr (car (cdr _)))的缩写。

这里汽车提取一对(car '(a . d)) = a的第一部分 和cdr提取一对(cdr '(a . d)) = d

的第二部分

让我们看看有什么好处:

> (cdr '(1 ((2 . 3) . (4 . ())) . ()))
'(((2 . 3) 4))
> (car (cdr '(1 ((2 . 3) . (4 . ())) . ())))
'((2 . 3) 4)
> (cdr (car (cdr '(1 ((2 . 3) . (4 . ())) . ()))))
'(4)
> (apply + 2 '(4))
6

注意((2.3)4)与((2.3)。(4。()))相同,并且(4。())又名(4)的cdr。

答案 1 :(得分:1)

结果是列表'(4),而不是数字4

您有一个包含两个元素的列表,其中1是第一个元素,列表((2 . 3) 4)是第二个元素。

换句话说,列表的cdr(cons ((2 . 3) 4)) '())(((2 . 3) 4))

> (cdr '(1 ((2 . 3) 4)))
'(((2 . 3) 4))

这是一个包含一个元素的列表 - 列表((2 . 3) 4) - 当然是car

> (car (cdr '(1 ((2 . 3) 4))))
'((2 . 3) 4)

,最后,

> (cdr (car (cdr '(1 ((2 . 3) 4)))))
'(4)