2016-11-27 52 views
0

我想將所有列表合併成一個。合併列表的列表並返回一個循環

這是到目前爲止我的代碼:

(DEFUN DESCRIPTION (BLOCK) 
    (loop initially (setf result '()) 
     for desc in (DESC2 BLOCK) 
     do (append result desc) 
     finally (return result) 
     ) 
) 

功能(DESC2 BLOCK)返回如下:

((SHAPE BRICK) (COLOR GREEN) (SIZE SMALL) (SUPPORTED-BY B2) (SUPPORTED-BY B3)) 

我只需要簡單的函數返回一個合併的列表:

(SHAPE BRICK COLOR GREEN SIZE SMALL SUPPORTED-BY B2 SUPPORTED-BY B3) 

我已經嘗試了很多方法,並且研究了這麼多。我很抱歉,但我不完全瞭解LISP語言,如果能幫助我,我將不勝感激!

謝謝您提前!

+0

不良風格。你可能想用'local-variable = init-value'來代替'最初(setf random-dynamic-variable init-value)'。帶''變量的變量在循環的範圍內被綁定一次。 – Kaz

回答

6

只需追加子列表中LOOP

CL-USER 23 > (loop for l in '((SHAPE BRICK) (COLOR GREEN) (SIZE SMALL) 
           (SUPPORTED-BY B2) (SUPPORTED-BY B3)) 
        append l) 
(SHAPE BRICK COLOR GREEN SIZE SMALL SUPPORTED-BY B2 SUPPORTED-BY B3) 

或使用REDUCEAPPEND

CL-USER 24 > (reduce #'append 
        '((SHAPE BRICK) (COLOR GREEN) (SIZE SMALL) 
         (SUPPORTED-BY B2) (SUPPORTED-BY B3))) 
(SHAPE BRICK COLOR GREEN SIZE SMALL SUPPORTED-BY B2 SUPPORTED-BY B3) 

或使用MAPCAN

CL-USER 25 > (mapcan #'copy-list 
        '((SHAPE BRICK) (COLOR GREEN) (SIZE SMALL) 
         (SUPPORTED-BY B2) (SUPPORTED-BY B3))) 
(SHAPE BRICK COLOR GREEN SIZE SMALL SUPPORTED-BY B2 SUPPORTED-BY B3) 

MAPCAN映射到列表上並將結果列表破壞性地連接起來。因此使用COPY-LIST複製子列表。

+0

非常感謝!我知道我正在變得更加艱難,那真的是這樣! – Nazariy1995