将列表添加到列表lisp

时间:2013-11-10 22:19:23

标签: list lisp

我是Lisp的新手,我无法弄清楚如何将列表添加到另一个列表中。我从一个空列表开始,我必须添加新列表,每个列表包含三个元素。例如,

(add '(1 2 3) '())

会返回((1 2 3)) [我们称之为新列表],并为此新列表添加新列表,例如

(add '(4 5 6) new-list)

会返回((1 2 3) (4 5 6))((4 5 6) (1 2 3))

我尝试了几种不同的方式,但到目前为止,我最接近的是((((1 2 3)) (4 5 6)) (7 8 9))

我使用的是这样的东西:

(defun add (lst new-let) (if (null lst) '() (setf new-lst (cons new-lst (cons lst '()))))

3 个答案:

答案 0 :(得分:1)

你试过了吗?

(defun add (thing lst) (append lst (list thing)))

我没有尝试使用Common Lisp,因为我更像是一种Scheme类型的人,我觉得它会起作用。

答案 1 :(得分:1)

我阅读它的方式,您的要求正是cons(非破坏性)或push(破坏性)。

答案 2 :(得分:0)

你是LISP的新手我想给你一个接受的答案。

列表是单链表。这样的结构允许在前面添加和删除是一个恒定的时间操作,而从末尾添加或删除某些内容将需要与列表中的元素在时间和空间中一样多的转动(它将必须重新创建列表结构这是方式)。

(defun add (element list)
  (cons element list))

这看起来非常熟悉..它实际上只是cons的包装器。因此,假设您有一个实际的应用程序,您希望使用add,但需要在您的问题中按顺序排列元素。一种方法是首先完成(添加要添加的内容),然后执行一个reversenreverse(如果每个元素都在您的函数中生成,并且突变对于外)..

(defun fetch-all (num-elements thunk &optional acc)
  (if (zerop num-elements)
      (nreverse acc)
      (fetch-all (- num-elements 1) thunk (add (funcall thunk) acc)))); add == cons