1

出于演示目的,

我有一个列表有一个列表:

 > (setf x (list '(1 2 1) '(4 5 4)))
 ((1 2 1) (4 5 4))
 > (length x)
 2

我想向它添加一个新列表 '(2 3 2) 。附加功能:

 > (append '(2 3 2) x)
 (2 3 2 (1 2 1) (4 5 4))

 > (length (append '(2 3 2) x))
 5

并没有真正做我想做的事。

我想要的是像这样添加'(2 3 2):

((8 7 8) (1 2 1) (4 5 4))

所以长度为3。

到目前为止,我还没有看到任何示例或方法来做我想做的事。是否有内置功能或有效的方法来做到这一点?

4

2 回答 2

4

APPEND不是破坏性功能,这是您所要求的。APPEND 所做的是分配一个新列表,然后它会返回该列表。

你可以做些什么来实现你的目标:

(setf x (append '((...)) x)) ;;appends the quoted list to x

还有一个函数NCONC,它破坏性地调整指针。

对于您的冥想,我提供示例工作:

CL-USER> (defparameter *x* nil)
*X*
CL-USER> (setf *x* '((1 2 3) (4 5 6)))
((1 2 3) (4 5 6))
CL-USER> (append *x* '(10 11 12))
((1 2 3) (4 5 6) 10 11 12)
CL-USER> (append *x* '((10 11 12)))
((1 2 3) (4 5 6) (10 11 12))
CL-USER> (setf *x* (append *x* '((10 11 12))))
((1 2 3) (4 5 6) (10 11 12))
CL-USER> *x*
((1 2 3) (4 5 6) (10 11 12))
CL-USER> 
于 2013-01-02T22:39:59.967 回答
2

APPEND appends lists. If you have a list of two sublists ((1 2 1) (4 5 4)) and you want to append another list of one sublist ((2 3 2)) in front of it.

CL-USER 99 > (append '((2 3 2)) '((1 2 1) (4 5 4)))
((2 3 2) (1 2 1) (4 5 4))

or use this, if you want to add one item in front of the list:

CL-USER 98 > (cons '(2 3 2) '((1 2 1) (4 5 4)))
((2 3 2) (1 2 1) (4 5 4))
于 2013-01-02T23:42:08.760 回答