方案:在没有父母的情况下获得cdr

时间:2011-11-19 23:55:31

标签: scheme racket let cdr

这可能是一件我想念的简单事情,但我正试图获得一对cdr,并且每次拨打(cdr (cons 'a '5))的电话都会显示为(5)。我有点理解为什么,但是如果没有parens我怎么能让它返回?

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

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

1 个答案:

答案 0 :(得分:7)

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

使用正确列表我指的是以空列表结尾的列表。例如,当您执行此操作(define lst '(4 5))时,会将此内容分配给lst(cons 4 (cons 5 '())),因此当您评估(cdr lst)时,您会获得 second < / em>第一个cons的元素,恰好是(cons 5 '()),后者又打印为(5)

仅提取列表中的第二个元素(不是第一个cons的第二个元素,这是cdr的作用),您可以:

  1. 正如评论中所指出的那样,使用(car (cdr lst))或仅使用(cadr lst)
  2. 更简单:使用(second lst)
  3. 另一种可能性 - 如果列表只有两个元素,并且可以用不正确的列表替换它,可以使用(define cell (cons 4 5))(define cell '(4 . 5))构建一个cons单元格然后你可以使用{{1}提取第一个元素,(car cell)提取第二个元素。