方案:获取不带括号的 cdr

标签 scheme racket let cdr

这可能是我错过的一件简单的事情,但我试图获取一对的 cdr 以及每次调用 (cdr (cons 'a '5) ) 返回为 (5)。我有点明白为什么会这样,但是我怎样才能让它在没有括号的情况下返回呢?

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

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

最佳答案

当应用于正确的列表时,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. 更简单:使用(第二个)
  3. 另一种可能性 - 如果列表只有两个元素并且可以用不正确的列表替换它,请使用 (define cell (cons 4 5))(define cell '( 4 . 5)) 构建一个 cons 单元,然后您可以使用 (car cell) 提取第一个元素,使用 (cdr cell) 提取第一个元素第二个元素。

关于方案:获取不带括号的 cdr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8198323/

相关文章:

haskell : using guards after where

javascript - 如何在 JavaScript 中模拟 let 表达式?

scheme - Chibi Scheme - 简单的定义库示例不起作用

struct - 如何在 typed/racket 中使用默认值初始化结构体?

audio - 声音操纵引擎强烈回响在DrRacket中崩溃

scheme - DrScheme 与 mzscheme : treatment of definitions

javascript - 是什么导致 "var"和 "let"之间的不同行为,当为它们分配一个抛出错误的函数的返回值时

scheme - SICP 1.25 解释器问题

scheme - 如何使用 biwascheme 进行增量?

data-structures - `set-car!` 的 `cdr` 也改变了 `car`,为什么?