List LISP:反转虚线列表
公共Lisp中有一个问题:一个温和的介绍。问题是获取列表中的最后一个元素,而不是cons单元格。宏List LISP:反转虚线列表,list,lisp,common-lisp,cons,List,Lisp,Common Lisp,Cons,公共Lisp中有一个问题:一个温和的介绍。问题是获取列表中的最后一个元素,而不是cons单元格。宏LAST返回点列表中的cons单元格。问题是使用宏reverse而不是last,但是clisp和sbcl都会抛出错误 (reverse '(a b c . d)) => error CLHS文档说明,我们只能反转正确的列表(顺序),而不能反转虚线列表或循环列表 编辑 我已经用LAST编写了程序 (defun last-element (x) "x is a list with l
LAST
返回点列表中的cons单元格。问题是使用宏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
。函数last
返回任何正确列表或点列表的最后cons
单元格,只要列表不是循环的
听起来问题是关于练习6.6:
使用LAST函数编写名为LAST-ELEMENT的函数,该函数返回列表的最后一个元素,而不是最后一个单元格。使用REVERSE而不是LAST编写LAST-ELEMENT的另一个版本。使用n和长度编写另一个版本
如果这是目的的话,练习将指定虚线列表输入。对于正确的列表,last
将返回cdr
中带有nil
的cons
单元格,例如(last'(a b c d)
-->(d.nil)
,或者只返回(d)
,因此正确列表的最后一个元素是最后一个cons
单元格的car
如果要同时处理正确的列表和虚线列表,则需要确定输入是哪一个,并相应地进行处理:对于虚线列表,最后一个“元素”将是最后一个cons
单元格的cdr
。相应地处理reverse
版本的输入意味着您必须在应用reverse
之前确定输入是正确的列表还是虚线列表。您可以编写一个函数,在使用rever之前将虚线列表转换为正确的列表se
从技术上讲:
元素n.1.(指列表)构成列表的一个消费品的汽车
对于像(abcd)
这样的适当列表,nil
是终止原子(因为(abcd)
与(abcd.nil)
)和(d.nil)相同)是最后一个cons;d
是最后一个cons
的car
,因此是列表的最后一个元素。对于像(abc.d)
这样的虚线列表,d
是终止原子,(c.d)
是最后一个cons
。由于c
是最后一个cons
的car
,c
是虚线列表中定义的最后一个真实元素。如果说d
是(a b c.d)
的最后一个成员,可能会更准确
但是,Common Lisp中的练习6.6:温和的介绍仅适用于适当的列表。自己定义一个吗?我应该使用reverse
定义自己的函数。与应用程序编程和递归程序设计相关的章节还没有出现。此外,还考虑使用nthcdr
和nth
。但是我们无法对其进行一般化。我已经编辑了我的问题。请参考。作为旁注,理解last
,reverse
&c是函数,而不是宏是非常重要的。这种差异对于理解Lisp非常重要。特别值得思考的是,为什么不能将reverse
作为一个宏。你可能还不知道为什么,但请记住这一点。谢谢。这正是困惑所在。练习6.6提到LAST
返回cons cell
,并要求我们编写一个函数LAST-ELEMENT
,返回最后一个元素。因此,我自然认为输入列表将以pointed-p结尾air
。这是我的误解。现在,我不得不担心将不正确的列表(虚线列表)转换为正确的列表。再次感谢。@SreekumarR--“如果结果是NIL
”:正确列表的最后一个元素不是NIL
。对于(a b c d)
最后一个元素是d
,而nil
是终止原子。@SreekumarR--问题是last element
返回列表的最后一个元素:正确的列表。last
函数返回列表的最后一个cons
,而不是该列表的最后一个元素。列表的最后一个元素是<该列表最后一个cons
的code>car
。实际上,last
可以接受一个整数参数并返回列表的最后一个n
cons
es。IAC,的最后一个cons
(a b c d)
是cons
(d.nil)
,最后一个元素是(car'(d.nil))
是d
nil
不是列表的一个元素,'(d.nil)
@SreekumarR--list'(a b c d)
只是一个cons
序列;它与'(a b c d.nil)相同
,但是nil
不是列表中的一个元素。非常感谢您不仅澄清了问题,还解释了问题。这是我在学习时的最初想法,但是虚线列表
在本书前面的一些示例中让我感到困惑。