16

有人可以给我一个关于Scheme的变化car和作用的基本解释吗?cdr

如果我是正确的,car将返回列表中的第一项。 cdr将返回一个不包括第一个元素的列表。

我对这些的其他变体感到困惑,更具体地说,诸如cadar, caddr,cddr等之类的东西。

假设我有一个随机的例子:

define X '(a b (c d e))

(car X)
(cdr X)
(cadr X)
(cadar X)

(car X)会生产a(cdr X)会生产(b (c d e))cadr会生产b。但我不知道如何推断car/ cdrlike的任何其他变体cadar

4

2 回答 2

29

您可以通过解析它们的名称来推断这些函数的含义:

在第一个字母 ('c') 和最后一个 ('r') 之间,“a”表示“汽车”,“d”表示“cdr”。

所以:

  • cadr是“cdr 的车”,
  • cddr是 cdr 的 cdr,
  • cadar是“汽车的 cdr 的汽车”(因此参数必须是列表的列表),
  • 等等
于 2012-10-28T20:01:24.983 回答
7

The easiest way is to enter it into a scheme interpreter:

(car X)   -> a
(cdr X)   -> (b (c d e))
(cadr X)  -> (car (cdr X))       -> (car '(b (c d e))) -> b
(cadar X) -> (car (cdr (car X))) -> (car (cdr 'a))     -> error

When you have more than one a or d, as you can see from the cadr example, you can read it backwards. First take the cdr (d) of the argument, then take the car (a) from the result, and so on until you get to the first one.

于 2012-10-28T20:03:33.870 回答