LISP:反转虚线列表

Sreekumar R

Common Lisp中有一个问题:简介问题是要获取列表中最后一个元素而不是cons cellLAST返回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:

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

如果这样做的话,本练习将指定点列表输入。list以非限定方式使用时,几乎总是意味着适当的list对于一个适当的列表last会返回一个cons单元与nilcdr,例如,(last '(a b c d)- > (d . nil),或只是(d),这样一个适当的列表的最后一个元素是car最后的cons细胞。

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

从技术上讲,该标准不认为以点列表结尾的原子是其元素之一

元素 1.(列表中的)一个对象,它是构成列表的简而言之之一的汽车。

对于像这样的适当列表(a b c d)nil是终止原子(因为(a b c d)与相同(a b c d . nil)),并且(d . nil)是最后一个缺点;dcarlast的cons,因此是列表的最后一个元素。对于像这样的虚线列表(a b c . d)d是终止原子,并且(c . d)是最后一个原子cons在标准中定义的点列表中,因为ccarlast的cons,所以c是true的最后一个true元素它可能会更准确的说,d是最后一个成员(a b c . d)

但是,《Common Lisp:柔和的介绍》中的练习6.6仅适用于正确的列表。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章