2

嗨,我正在尝试将一个简单的元素附加到 lisp 列表中。

(append queue1 (pop stack1))

我认为上面的代码会将stack1的第一个元素附加到queue1。queue1需要非零吗?谢谢。

4

2 回答 2

3

Append返回串联列表(附加queue1的第一个元素stack1)。它不会修改 queue1。

append 的破坏性等价物是 nconc:它“就地”附加到列表中。

于 2009-10-15T02:27:01.410 回答
1

您没有指定您的意思是哪个 Lisp,但至少在 Common Lisp 中:

  1. APPEND 连接列表,因此它的所有参数都必须是列表,而不是原子。如果您真的想将一个元素附加到列表中,您必须这样做(append list1 (list element))。这不是一个好主意,因为在大多数 Lisps 列表中都是单链接的,并且必须遍历整个列表才能追加到末尾。通常会用 CONS 附加到前面,然后在完成后反转列表,但这显然不适用于队列。

  2. APPEND 不会修改其参数。NCONC 是一个破坏函数。虽然我相信 NCONC 特别被指定为或多或少地执行人们期望的操作,但大多数破坏性函数都可以破坏它们的参数,重用它们的内存,但不一定会留下任何连贯的东西。

  3. Common Lisp 中的列表被实现为 cons 单元或 nil 链,这意味着它们的行为与后者有关。如果您希望列表表现得更符合您对其他语言的期望,请使用列表抽象数据结构。如果您想要一个不断追加到末尾的队列,则更是如此。cl-containers系统中有许多命令式数据结构可用,而FSet中有许多功能性数据结构。

于 2009-10-15T09:06:40.510 回答