繁体   English   中英

LISP:反转点列表

[英]LISP: Reversing a dotted list

Common Lisp: A Gentle Introduction中有一个问题。 问题是获取列表中的最后一个元素而不是cons cell 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

function last返回任何适当列表或虚线列表的最后一个cons单元格,只要该列表不是循环的。

听起来这个问题是关于练习 6.6 的:

使用 LAST function 编写一个名为 LAST-ELEMENT 的 function,它返回列表的最后一个元素而不是最后一个 cons 单元格。 使用 REVERSE 而不是 LAST 编写另一个版本的 LAST-ELEMENT。 使用 NTH 和 LENGTH 编写另一个版本。

如果这是意图,练习将指定点列表输入。 list以不合格的方式使用时,它几乎总是意味着正确的 list 对于适当的列表last将在cdr中返回一个带有nilcons单元格,例如(last '(ab c d) --> (d. nil)或只是(d) ,因此适当列表的最后一个元素是最后一个cons牢房的car

如果您想同时处理正确列表和虚线列表,则需要确定输入是哪个并相应地处理它:对于虚线列表,最后一个“元素”将是最后一个cons单元格的cdr 相应地处理reverse版本的输入意味着您必须在应用reverse之前确定输入是正确的列表还是虚线列表。 在使用reverse之前,您可以编写 function 将虚线列表转换为正确的列表。

从技术上讲, 标准不认为终止虚线列表的原子是其元素之一

元素 n。 1.(一个列表的)一辆 object 是组成列表的其中一辆 conses 的汽车。

对于像(ab c d)这样的适当列表, nil是终止原子(因为(ab c d)与 (ab c d.nil) 相同),并且(d. nil) (ab c d. nil)最后一个缺点; d是最后一个conscar ,因此是列表的最后一个元素。 对于像(ab c. d)这样的虚线列表, d是终止原子,而(c. d)是最后一个cons 由于c是最后一个conscar ,因此c是虚线列表在标准中定义的意义上的最后一个真元素 d(ab c. d)的最后一个成员可能更准确。

但是, Common Lisp 中的练习 6.6:简单介绍仅适用于适当的列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM