添加到LISP中的列表末尾

时间:2012-11-13 10:25:19

标签: append lisp common-lisp

  

可能重复:
  what is the ‘cons’ to add an item to the end of the list?

在看了很多关于lisp的教程并在google上搜索高低搜索后,我仍然无法弄清楚如何添加到LISP列表的末尾。

我希望我的功能在列表'a的末尾添加'(b c d),但我只知道如何在前面添加它。有人可以帮我正确使用缺点在列表末尾添加'a吗?这是我的代码。提前谢谢。

(defun AddRt (a list)
  (cond
    ((null list)
      0)
    (t
      (princ (cons a (cons (car list) (cdr list))))
    )))


(AddRt 'a '(b c d))

3 个答案:

答案 0 :(得分:15)

pushlast,或使用nconc

> (defparameter a (list 1 2 3))
A
> (push 4 (cdr (last a)))
(4)
> a
(1 2 3 4)
> (nconc a (list 5))
(1 2 3 4 5)
> a
(1 2 3 4 5)

请注意,这些是destructive operators,即他们会修改a对象,而不仅仅是绑定< / {>的a

这就是为什么,顺便说一句,你应该永远在引用的列表上使用nconc,例如(nconc '(1 2 3) '(4 5 6))

PS。请注意,添加到列表的 end 需要完整 遍历,因此是O(length(list))操作。这可能很糟糕 如果你的名单很长,那么人们经常会使用 push / nreverse 成语,例如,

(let (range)
  (dotimes (i 10 (nreverse range))
    (push i range)))
==> (0 1 2 3 4 5 6 7 8 9)

答案 1 :(得分:5)

您可以使用递归函数。另外,你应该避免在里面使用princ。

以下函数 endcons cons 完全相同,只是在最后添加了值。

(defun endcons (a v)
   (if (null v) (cons a nil) (cons (car v) (endcons a (cdr v)))))

(endcons 'a '(b c d))

当然,您也可以使用追加

(append '(b c d) '(a))

另请参阅此相关问题:what is the 'cons' to add an item to the end of the list?

答案 2 :(得分:4)

一种方法是撤销列表。将元素添加到反转列表的开头。然后最后反转整个列表。

计划代码:

(define (add-to-tail l x)
   (reverse (cons x (reverse l)))

但如果这是您经常需要的操作,那么我建议您找到除(单个链接)列表之外的数据结构。