1

我今天刚开始学习 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 . 4)

所以我的问题是,这点从何而来?

另外,如果我尝试运行,(length (my-butlast '(1 2 3 4)))我会得到一个神秘的错误:正确的列表不能以 4 结尾。这是什么意思?

4

2 回答 2

6

.用于表示一个conswho cdris not NIL。例如

(cons 1 2)

显示为

(1 . 2)

如果你这样做,考虑一下你的函数会发生什么

(my-butlast '(1 2))

测试(eq nil (my-butlast (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))).

于 2013-08-15T05:41:56.657 回答
1

尝试做我相信你的基本情况(我写 lisp 已经有一段时间了):

(list (first L))

(第一个 L)不会返回一个列表,一个元素到另一个元素的缺点将创建您正在查看的结构。本质上,您的链接列表以 [3|4] 结尾,而不是 [3|->] [4|0] 与我的蹩脚的 ascii 方框图。

于 2013-08-15T05:39:51.813 回答