2009-10-15 36 views
2

嗨我想一个简单的元素添加到一个口齿不清列表。Lisp的追加工作不正常

(append queue1 (pop stack1)) 

我想上面的代码会将stack1的第一个元素附加到queue1。 queue1需要不是零?谢谢。

+0

你真的应该读的入门书 – 2009-10-15 09:49:39

+0

追加到Lisp的名单到底是不是一个好主意 – 2009-10-15 09:50:41

+0

追加返回具有附加的参数列表列表 - (追加列表1列表2项目list3) - >带列表list1和list2和list3的元素 – 2009-10-15 09:53:15

回答

4

附加返回连接列表(queue1,附加stack1的第一个元素)。它不会修改队列1。

追加的破坏力相当于是nconc:本追加到列表“到位”。

+0

所以要附加到列表,我应该简单地执行(nconc queue1'4)将数字4附加到列表queue1。另外如果nconc是零,它还会追加吗?谢谢 – 2009-10-15 02:57:28

+0

是的,(nconc queue1'4)将回收队列1。在习惯上,你仍然应该使用返回的值,而不是依靠副作用。对不起,我不确定如果你通过nil会发生什么(尽管我认为它不会在零字面上):旋转你的Lisp实现并尝试它我猜! – itowlson 2009-10-15 03:27:54

1

你没有指定的Lisp你的意思,但在Common Lisp中至少包括:

  1. append连接列表,所以其所有的参数必须是列表,原子。如果你真的想追加一个元素到列表中,你必须做(append list1 (list element))。这不是一个好主意,因为在大多数Lisp列表中都是单链接的,并且必须遍历整个列表才能追加到最后。通常可以用CONS追加到前面,然后在完成时颠倒列表,但这显然不适用于队列。

  2. APPEND不会修改其参数。 NCONC是一个破坏性的功能。虽然我相信NCONC特别是specified做更多或更少的人会发生什么,最具破坏性的功能被允许摧毁它们的参数,再利用他们的记忆,但没有必要留下任何连贯的后面。 Common Lisp中

  3. 解释被实现为利弊细胞或零,这意味着它们的行为具有与后者一些怪癖的链。如果您希望列表的行为更像您期望的其他语言那么使用列表抽象数据结构。更何况,如果你想要一个带有常量追加的队列到最后。 cl-containers系统中有许多必要的数据结构,FSet中有功能数据结构。