我有这个例子:
(apply + 2 (cdadr '(1 ((2 . 3) 4))))
这会返回6?为什么(cdadr '(1 ((2 . 3) 4)))
4 ??
我不明白。它不是3?
答案 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)