0

我是 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 '()))))

4

3 回答 3

2

你有没有尝试过 :

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

我没有用 Common Lisp 尝试过这个,因为我更像是一个 Scheme 类型的人,但我认为它会起作用。

于 2013-11-10T22:36:01.203 回答
1

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

于 2013-11-10T22:38:33.150 回答
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
于 2013-11-10T23:20:36.427 回答