为什么这个LISP代码会发出句点或者抱怨列表不能以4结尾?

为什么这个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

我今天刚开始学习LISP只是为了好玩,所以我对它完全陌生。不过我确实有其他语言的经验。我试图编写一个函数,除了没有最后一个元素外,它完全按原样返回列表

尽管我打算重写这个函数,因为我确信有一种更简单的方法,但我的版本产生了一些非常不寻常的输出。作为记录,我使用的是CLISP环境

(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相同。请花几分钟时间学习。中有关于列表的打印表示以及正确与不正确列表的详细信息。中有关于列表的打印表示以及正确与不正确列表的详细信息。