2010-04-11 6 views

ответ

7
(apply #'append '((a b c) (d e f) (g h i))) 

или

(loop for outer in '((a b c) (d e f) (g h i)) 
     nconcing (loop for inner in outer collecting inner)) 
+0

Отлично! - только то, что мне нужно. – Cheeso

+1

'nconc' (и' mapcan') может быть плохим для вашего здоровья. –

+1

@eli: Конечно. Но в петле выше это нормально, или это так? Внутренний цикл возвращает свежие списки, поэтому 'nconc'ing - это нормально. – Dirk

3

Это типичный вопрос домашнего задания. Обычно эта операция называется FLATTEN (которая выравнивает списки на всех уровнях).

(mapcan #'copy-list '((a b c) (d e f) nil (g h))) 

Применить вариант имеет проблему, что она может работать в CALL-АРГУМЕНТАХ-LIMIT, когда имеется больше, чем подсписки CALL-АРГУМЕНТЫ-LIMIT.

См, например, также http://rosettacode.org/wiki/Flatten_a_list#Common_Lisp

+0

Спасибо за полезный ответ. Это определенно не было для меня домашней работой. Может быть, 20 лет назад, возможно, у меня было это задание на домашнюю работу, но сейчас я не могу вспомнить это! – Cheeso

+0

@Cheeso: это был намек на то, что вы можете найти для него решения ... –

0

Вы можете также использовать reduce и append:

(reduce #'append '((a b c) (d e f) nil (g h))) 

К сожалению, это гораздо меньше времени и пространства эффективно, чем другие решения, так как он вызывает append много и копирует результат в процессе без необходимости.

Смежные вопросы