2010-04-11 6 views

Répondre

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

ou

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

Parfait! - Juste ce dont j'avais besoin. – Cheeso

+1

'nconc' (et' mapcan') peut être mauvais pour votre santé. –

+1

@eli: Certainement. Mais dans la boucle ci-dessus c'est bien, ou est-ce? La boucle interne renvoie de nouvelles listes, donc 'nconc'ing est ok. – Dirk

3

C'est une question typique de devoirs. Généralement, cette opération s'appelle FLATTEN (qui aplatit les listes à tous les niveaux).

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

La variante a POSTULER le problème qu'il peut exécuter dans l'appel ARGUMENTS-LIMIT quand il y a plus que des sous-listes CALL-ARGUMENTS LIMITE.

Voir par exemple aussi http://rosettacode.org/wiki/Flatten_a_list#Common_Lisp

+0

Merci pour la réponse utile. Ce n'était définitivement pas mes devoirs. Peut-être qu'il y a 20 ans, j'aurais pu avoir cela comme question de devoirs, mais je ne me souviens plus si loin, maintenant! – Cheeso

+0

@Cheeso: c'était un indice que vous pouvez trouver des solutions pour cela ... –

0

Vous pouvez également utiliser reduce et append:

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

Malheureusement, c'est beaucoup moins de temps et de l'espace efficace que les autres solutions, car il appelle append beaucoup et copie les résultat en cours inutilement.

Questions connexes