gpt4 book ai didi

list - LISP:反转点列表

转载 作者:行者123 更新时间:2023-12-04 08:59:07 25 4
gpt4 key购买 nike

有问题Common Lisp:一个温和的介绍 .问题是获取列表中的最后一个元素而不是 cons 单元格。宏LAST返回 cons cell在一个虚线列表中。问的问题是使用宏reverse而不是 last ,但两者都是 clispsbcl正在抛出错误。

(reverse '(a b c . d))
=> error
CLHS 文档说我们只能反转正确的列表(序列),而不能反转点列表或循环列表。
编辑
我已经使用 LAST 编写了程序.
(defun last-element (x)
"x is a list with last element as dotted pair"
(cdr (last x)))
我不知道如何使用 reverse在这种情况下。

最佳答案

函数last返回最后一个 cons任何适当列表或虚线列表的单元格,只要列表不是圆形的。
听起来这个问题是关于练习 6.6:

Use the LAST function to write a function called LAST-ELEMENT that returns the last element of a list instead of the last cons cell. Write another version of LAST-ELEMENT using REVERSE instead of LAST. Write another version using NTH and LENGTH.


如果这是意图,则该练习将指定点状列表输入。 When list is used in an unqualified way, it almost always means proper list .获取正确列表 last将返回 cons带有 nil 的单元格在 cdr ,例如, (last '(a b c d) --> (d . nil) ,或只是 (d) ,所以正确列表的最后一个元素是 car最后的 cons细胞。
如果您想同时处理正确列表和点列表,您需要确定输入是哪个并相应地处理它:对于点列表,最后一个“元素”将是 cdr最后的 cons细胞。相应地处理 reverse 的输入version 意味着您必须在应用 reverse 之前确定输入是正确列表还是点列表.在使用 reverse 之前,您可以编写一个函数将点状列表转换为适当的列表。 .
从技术上讲, the Standard does not consider the atom which terminates a dotted list to be one of its elements :

element n. 1. (of a list) an object that is the car of one of the conses that comprise the list.


对于像 (a b c d) 这样的正确列表, nil是终止原子(因为 (a b c d)(a b c d . nil) 相同),和 (d . nil)是最后的缺点; dcar最后的 cons ,因此是列表的最后一个元素。对于像 (a b c . d) 这样的虚线列表, d是终止原子,而 (c . d)是最后 cons .自 ccar最后的 cons , c在标准中定义的意义上,是点列表的最后一个真实元素。更准确的说法可能是 d(a b c . d)的最后一个成员.
但是,Common Lisp: A Gentle Introduction 中的练习 6.6 仅适用于正确的列表。

关于list - LISP:反转点列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63646478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com