方案:获得没有parens的cdr

jbr*_*nan 3 scheme let racket cdr

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

我不想使用flatten因为我想要获得的(即cdr)本身可能是已经包含在parens中的另一个过程表达式,因此我不想将列表展平.

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

Ósc*_*pez 7

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

使用正确的列表我的意思是一个以空列表结尾的列表.例如,当您(define lst '(4 5))在引擎盖下执行此操作时,这将被分配给lst:(cons 4 (cons 5 '())),因此当您评估时,您(cdr lst)将获得第一个元素,第二个元素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单元格然后你可以(car cell)用来提取第一个元素并(cdr cell)提取第二个元素.

  • 感谢您提供我的问题的答案,而不是在我的问题中指出一点迂腐的技术错误.对此,我真的非常感激!:) (2认同)