2010-10-31 3 views
2

Possible en double:
How to remove nested parentheses in LISPComment éliminer tous les niveaux de listes dans LISP

Ceci est ma deuxième question rapide et stupide au sujet LISP, mais je suis un peu coincé. J'ai besoin d'accéder à tous les nœuds d'une liste avec plusieurs niveaux. J'ai besoin de quelque chose comme:

>> (get-symbols '(A (B (C D) E))) 
(A B C D E) 

Je ne me soucie pas de la commande. Comment feriez-vous cela? Je préfère l'intuitivité du code plutôt que l'efficacité.

Merci

+2

départ http://stackoverflow.com/questions/2680864/how-to-remove-nested-parentheses-in-lisp –

+0

"entre parenthèses imbriquées". Je n'ai pas pensé de cette façon pour le mettre, c'est pourquoi je n'ai pas trouvé celui-là. Si cela fonctionne pour moi, et je l'espère, devrais-je supprimer cette question? – jesusiniesta

+2

"aplanir les listes imbriquées" correspond à la description appropriée. Votre question est un doublon. Supprimez-le si vous le souhaitez. –

Répondre

4

De OnLisp:

(defun flatten (tree) 
    (if (atom tree) 
     (mklist tree) 
    (nconc (flatten (car tree)) 
     (if (cdr tree) (flatten (cdr tree)))))) 
4

Ce que vous avez besoin est la fonction flatten pour les listes. Le chercher.

+0

Je ne trouve pas cette fonction dans Common Lisp (j'ai oublié d'indiquer quelle version de Lisp je devais utiliser) – jesusiniesta

0
(defun get-symbols (lst) 
     (when lst 
      (if (atom lst) (list lst) 
       (append (get-symbols (car lst)) 
         (get-symbols (cdr lst)))))) 
Questions connexes