Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List LISP:反转虚线列表_List_Lisp_Common Lisp_Cons - Fatal编程技术网

List LISP:反转虚线列表

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

公共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 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
不是列表中的一个元素。非常感谢您不仅澄清了问题,还解释了问题。这是我在学习时的最初想法,但是
虚线列表
在本书前面的一些示例中让我感到困惑。