方案:获取不带括号的 cdr

发布于 2024-12-17 04:51:14 字数 351 浏览 3 评论 0原文

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

我不想使用 flatten 因为我试图获取的内容(即 cdr)本身可能是另一个已经包含在括号中的过程表达式,所以我不想展平列表。

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

This is probably a simple thing I'm missing, but I'm trying to get the cdr of a pair and every call to say (cdr (cons 'a '5)) comes back as (5). I sort of get why that is, but how can I get the it to return without the parens?

I don't want to use flatten because what I'm trying to get (i.e. the cdr) might itself be another procedure expression already wrapped in parens, so I don't want to flatten the list.

(If it matters, I'm working on transforming a let expression into a lambda expression, and this is one of the steps I'm taking, trying to break apart the lambda bindings so I can move them around).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

请别遗忘我 2024-12-24 04:51:14

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

对于正确的列表,我的意思是一个以空列表结尾的列表。例如,当您在后台执行此 (define lst '(4 5)) 时,这就是分配给 lst 的内容: (cons 4 (cons 5 '())),因此当您计算 (cdr lst) 时,您将获得第一个 cons第二个元素,其中恰好是 (缺点 5 '()),依次打印为 (5)

要仅提取 list 中的第二个元素(不是第一个 cons 的第二个元素,这是 cdr 所做的),您可以

  1. :已在评论中指出,请使用 (car (cdr lst)) 或简称 (cadr lst)
  2. 更简单:使用 (second lst) code>
  3. 另一种可能性 - 如果列表只有两个元素并且它是可以用不正确的列表替换它,使用 (define cell (cons 4 5))(define cell '(4 . 5)) 构建一个 cons 单元并那么您可以使用 (car cell) 提取第一个元素,使用 (cdr cell) 提取第二个元素。

When applied to a proper list, cdr will always return another list (including '(), the empty list).

With proper list I mean a list which ends with the empty list. For instance, when you do this (define lst '(4 5)) under the hood this is what gets assigned to lst: (cons 4 (cons 5 '())), so when you evaluate (cdr lst) you get the second element of the first cons, which happens to be (cons 5 '()), which in turn gets printed as (5).

For extracting only the second element in the list (not the second element of the first cons, which is what cdr does) you could:

  1. As has been pointed in the comments, use (car (cdr lst)) or just (cadr lst) for short
  2. Even simpler: use (second lst)
  3. Another possibility - if the list only has two elements and it's ok to replace it with an improper list, use (define cell (cons 4 5)) or (define cell '(4 . 5)) to build a cons cell and then you can use (car cell) to extract the first element and (cdr cell) to extract the second element.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文