您好我正在尝试将一个简单元素添加到lisp列表中。
(append queue1 (pop stack1))
我认为上面的代码会将stack1的第一个元素追加到queue1。 queue1
是否必须是非零的?感谢。
答案 0 :(得分:4)
追加返回连接列表(queue1
,其中附加了stack1
的第一个元素。它不会修改queue1。
附加的破坏性等价物是nconc:这会在“就地”附加到列表中。
答案 1 :(得分:1)
你没有指明哪个Lisp是什么意思,但至少在Common Lisp中指定:
APPEND连接列表,因此它的所有参数都必须是列表,不是 atoms。如果您真的想在列表中附加元素,则必须执行(append list1 (list element))
。这不是一个好主意,因为在大多数Lisps列表中都是单链接的,并且必须遍历整个列表才能追加到最后。通常会有一个用CONS附加到前面,然后在完成后反转列表,但这显然不适用于队列。
APPEND不会修改其参数。 NCONC是一种破坏性的功能。虽然我认为NCONC特别是specified或多或少地做了人们所期望的,但大多数破坏性功能都被允许销毁他们的论点,重用他们的记忆,但不一定留下任何东西连贯的背后。
Common Lisp中的列表被实现为cons细胞链或nil,这意味着它们的行为有一些与后者有关的怪癖。如果您希望列表的行为与其他语言相同,则使用列表抽象数据结构。更重要的是,如果你想要一个持续追加到最后的队列。 cl-containers系统中有许多必需的数据结构,以及FSet中的功能数据结构。