[英]LISP: Reversing a dotted list
Common Lisp: A Gentle Introduction中有一个问题。 问题是获取列表中的最后一个元素而不是cons cell 。 宏LAST
以虚线列表的形式返回cons cell
。 提出的问题是使用宏reverse
而不是last
,但clisp
和sbcl
都抛出错误。
(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
中返回一个带有nil
的cons
单元格,例如(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
是最后一个cons
的car
,因此是列表的最后一个元素。 对于像(ab c. d)
这样的虚线列表, d
是终止原子,而(c. d)
是最后一个cons
。 由于c
是最后一个cons
的car
,因此c
是虚线列表在标准中定义的意义上的最后一个真元素。 说d
是(ab c. d)
的最后一个成员可能更准确。
但是, Common Lisp 中的练习 6.6:简单介绍仅适用于适当的列表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.