为什么这个LISP代码会发出句点或者抱怨列表不能以4结尾?
我今天刚开始学习LISP只是为了好玩,所以我对它完全陌生。不过我确实有其他语言的经验。我试图编写一个函数,除了没有最后一个元素外,它完全按原样返回列表 尽管我打算重写这个函数,因为我确信有一种更简单的方法,但我的版本产生了一些非常不寻常的输出。作为记录,我使用的是CLISP环境为什么这个LISP代码会发出句点或者抱怨列表不能以4结尾?,lisp,common-lisp,Lisp,Common Lisp,我今天刚开始学习LISP只是为了好玩,所以我对它完全陌生。不过我确实有其他语言的经验。我试图编写一个函数,除了没有最后一个元素外,它完全按原样返回列表 尽管我打算重写这个函数,因为我确信有一种更简单的方法,但我的版本产生了一些非常不寻常的输出。作为记录,我使用的是CLISP环境 (defun my-butlast (L) (if (null (rest L)) nil (if (eq nil (my-butlast (rest L))) (fir
(defun my-butlast (L)
(if (null (rest L))
nil
(if (eq nil (my-butlast (rest L)))
(first L)
(cons (first L) (my-butlast (rest L)))
)
)
)
(my-butlast '(1 2 3 4 5))
这产生了输出1 2 3。四,
所以我的问题是,这一点从何而来
此外,如果我尝试运行长度,但最后的'1 2 3 4,我会得到一个神秘的错误:一个正确的列表不能以4结尾。这是什么意思?试着做我相信对于你的基本情况,我写lisp已经有一段时间了:
(list (first L))
首先,L不会返回列表,一个元素与另一个元素的cons将创建您正在查看的结构。基本上,您的链接列表以[3 | 4]结尾,而不是以[3 |->][4 | 0]结尾,使用我蹩脚的ascii方框图。尝试一下,我相信对于您的基本情况,我写lisp已经有一段时间了:
(list (first L))
首先,L不会返回列表,一个元素与另一个元素的cons将创建您正在查看的结构。基本上,您的链接列表以[3 | 4]结尾,而不是以[3 |->][4 | 0]结尾,使用我的蹩脚ascii方框图。。用于表示cdr不是NIL的cons。例如
显示为
(1 . 2)
如果您这样做,请考虑函数中会发生什么
(my-butlast '(1 2))
测试等式nil my但last rest L将为真,因此它返回first L。请注意,这只是数字1,而不是包含1的列表。您需要更改为:
(if (eq nil (my-butlast (rest L)))
(list (first L))
(cons (first L) (my-butlast (rest L)))
)
顺便说一句,写null my butlast rest L更为惯用。。用于表示cdr不是NIL的cons。例如
显示为
(1 . 2)
如果您这样做,请考虑函数中会发生什么
(my-butlast '(1 2))
测试等式nil my但last rest L将为真,因此它返回first L。请注意,这只是数字1,而不是包含1的列表。您需要更改为:
(if (eq nil (my-butlast (rest L)))
(list (first L))
(cons (first L) (my-butlast (rest L)))
)
顺便说一句,写null my butlast rest L更为惯用。不需要第二个if。将备选方案更改为第二个if备选方案,因为列表x与cons x相同。请花几分钟时间学习。您不需要第二个if。如果备选方案与cons x相同,请将备选方案更改为第二个,因为列表x与cons x相同。请花几分钟时间学习。中有关于列表的打印表示以及正确与不正确列表的详细信息。中有关于列表的打印表示以及正确与不正确列表的详细信息。