Comment faire pour supprimer les parenthèses imbriquées en LISP
Comment puis-je supprimer les parenthèses imbriquées de manière récursive en Common LISP comme
(unnest '(a b c (d e) ((f) g))) => (a b c d e f g)
(unnest '(a b)) => (a b)
(unnest '(() ((((a)))) ())) => (a)
Grâce
Vous n'avez pas supprimer les parenthèses. Les parenthèses ne sont qu'un aspect d'une représentation imprimée pour les listes. Ce que vous faites est l'aplatissement des listes.
OriginalL'auteur bubdada | 2010-04-21
Vous devez vous connecter pour publier un commentaire.
Voici ce que j'avais à faire:
Qui travaille principalement parce que j'ai Quicklisp déjà installé.
OriginalL'auteur Xach
OriginalL'auteur Donnie Cameron
OriginalL'auteur Bill
Je me rends compte que c'est un vieux fil, mais il est l'un des la première qui me vient quand je google lisp aplatir. La solution que j'ai découvert est similaire à ceux décrits ci-dessus, mais la mise en forme est légèrement différente. Je vais vous expliquer que si vous êtes nouveau à lisp, comme je l'ai été quand j'ai googlé cette question, il est donc probable que d'autres le seront également.
Pour ceux qui sont nouveaux à lisp, c'est un bref résumé.
La ligne suivante déclare une fonction appelée aplatir avec l'argument L.
La ligne ci-dessous vérifie si la liste est vide.
La ligne suivante renvoie nul parce que les cons de l'ATOME nil déclare une liste avec une entrée (ATOM). C'est le cas de base de la récursivité et permet à la fonction de savoir quand s'arrêter. La ligne après cette vérification pour voir si le premier élément de la liste est un atome à la place d'une autre liste.
Puis, si elle l'est, il utilise la récursivité pour créer une liste réduite de cet atome combiné avec le reste de la liste aplatie que la fonction va générer. les inconvénients combine un atome avec une autre liste.
Si ce n'est pas un atome, alors nous avons pour aplatir sur elle, parce que c'est une autre liste que peuvent avoir d'autres listes à l'intérieur d'elle.
La fonction append ajoute la première liste pour le début de la deuxième liste.
Notez également que chaque fois que vous utilisez une fonction lisp, vous devez l'entourer avec la parenthèse. Ce qui me confond au premier abord.
OriginalL'auteur Chantry Cargill
On pourrait définir comme ceci par exemple:
OriginalL'auteur Jakob
Lisp a la fonction
remove
pour enlever des choses. Ici, j'utilise une versionREMOVE-IF
qui supprime tous les élément pour lequel un prédicat est vrai. Je test si la chose est une parenthèse et de les supprimer si vrai.Si vous souhaitez supprimer les parenthèses, voir cette fonction:
Noter, cependant, que les Svante mentionne, on n'a généralement pas d'enlever les parenthèses.
OriginalL'auteur Rainer Joswig
C'est un accumulateur. La fonction locale %aplatir garde un accumulateur de la queue (le droit partie de la liste qui a déjà été aplatie). Lorsque la partie qui reste à être aplatie (les gauche partie de la liste) est vide, il revient la queue. Lorsque la partie aplatie est un non-liste, il renvoie la partie préfixe sur la queue. Lorsque la partie aplatie est une liste, il aplatit le reste de la liste (avec le courant de la queue), puis utilise ce résultat comme la queue pour l'aplatissement de la première partie de la liste.
OriginalL'auteur Joshua Taylor
Je sais que cette question est vraiment vieux mais j'ai remarqué que personne ne l'utilise le push/nreverse idiome, et je suis donc en téléchargement ici.
la fonction
reverse-atomize
prend chaque "atome" et le met dans laoutput
de l'appel suivant. À la fin, il produit une liste aplatie qui est en arrière, qui est résolu avec lenreverse
fonction dans leatomize
fonction.Afin de l'appelant
atomize '((a b) (c) d)
ressemble à ceci:Et si vous deviez appeler
reverse-atomize
avecreverse-atomize '((a b) (c) d)
cela ne se produise:Gens aiment utiliser des fonctions comme
push
,nreverse
, etnconc
, car ils utilisent moins de mémoire vive que leurs respectifscons
,reverse
, etappend
fonctions. Cela étant dit, la double nature récursive dereverse-atomize
vient avec son propre RAMtech niques.OriginalL'auteur Spenser Truex
OriginalL'auteur Bernard Adrian