2013-01-02 97 views
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

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> 
+0

好快啊!我從來沒有想過這樣的想法。 感謝有關解釋破壞性和非破壞性功能的解釋。幫了很多。 – jbchichoko

2

APPEND追加列表。如果您有兩個子列表((1 2 1) (4 5 4))的列表,並且您希望在其前面追加另一個子列表((2 3 2))的列表。

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

,或者如果你想在列表的前面加一個項目使用,:

CL-USER 98 > (cons '(2 3 2) '((1 2 1) (4 5 4))) 
((2 3 2) (1 2 1) (4 5 4))