3

这可能是我想念的一件简单的事情,但我正试图得到cdr一对,并且每个要说的电话(cdr (cons 'a '5))都返回为(5). 我有点明白为什么会这样,但是我怎样才能让它在没有括号的情况下返回呢?

我不想使用flatten,因为我想要得到的(即 cdr)本身可能是另一个已经包裹在括号中的过程表达式,所以我不想展平列表。

(如果重要的话,我正在努力将let表达式转换为lambda表达式,这是我正在采取的步骤之一,试图分解 lambda 绑定,以便我可以移动它们)。

4

1 回答 1

7

当应用于正确的列表时,cdr将始终返回另一个列表(包括'()空列表)。

对于正确的列表,我的意思是一个以空列表结尾的列表。例如,当您(define lst '(4 5))在后台执行此操作时,这就是分配给lst:的内容(cons 4 (cons 5 '())),因此当您评估时,(cdr lst)您会得到第一个元素的第二个cons元素,恰好是(cons 5 '()),而它又被打印为(5).

要仅提取列表中的第二个元素(不是 first 的第二个元素cons,这是做什么cdr的),您可以:

  1. 正如评论中所指出的,使用(car (cdr lst))(cadr lst)简称
  2. 更简单:使用(second lst)
  3. 另一种可能性 - 如果列表只有两个元素并且可以用不正确的列表替换它,请使用(define cell (cons 4 5))(define cell '(4 . 5))构建一个 cons 单元格,然后您可以使用它(car cell)来提取第一个元素并(cdr cell)提取第二个元素。
于 2011-11-20T15:25:05.477 回答