Comment convertir une chaîne à la liste à l'aide de clisp?
Comment puis-je convertir la chaîne "1 2 3 4 5 6 7"
dans la liste (1 2 3 4 5 6 7)
élégamment? Je suis avec CLISP.
- Alors, quels sont exactement vous essayez de faire? "Chaîne à la liste" implique de passer d'une chaîne à une liste de caractères, mais votre exemple est de lire des choses séparées par des espaces.
- je suis un lisp débutant. Et je n'ai pas trouver de "split" comme fonction. Jusqu'à maintenant, je peux utiliser "parse-integer" convertir "123" 123.
- Avec cl-ppcre:
(mapcar #'parse-integer (ppcre:split #\space "1 2 3"))
Vous devez vous connecter pour publier un commentaire.
Conseil: jetez un oeil à avec-entrée-de-chaîne.
Vous devez utiliser
parse-integer
dans une boucle.Par exemple, à l'aide de
loop
:⇒
(1 2 3)
Si vous avez besoin d'un meilleur contrôle à propos de la division, de l'utilisation de la
split-sequence
oucl-ppcre
bibliothèque.Si vous avez besoin d'analyser plus générale, les formats de nombre, l'utilisation de la
parse-number
bibliothèque.Bibliothèques sont disponibles à partir de Quicklisp.
il fonctionne cependant je sens qu'il n'est pas aussi élégante que il y a beaucoup de
read
appel .merci encore!
(with-input-from-string (s "1 2 3 4 5 6 7") (loop for x = (read s nil :end) until (eq x :end) collect x))
devrait fonctionner, mais note qu'il faudra"one two three"
à une liste de symboles plutôt que d'une liste de chaînes de caractères.Voici une solution récursive.
Je vois que Svante est droit. Ma précédente tentative n'a pas fonctionné. Voici une autre tentative. J'utilise concaténer à la chaîne dans une liste à la représentation. Puis-je utiliser la lecture à partir de la chaîne à convertir la chaîne (s-2) dans une liste.
Je roule dans une fonction comme ceci:
Le seul but de "laisser" et "L" est de rendre la fonction de chaîne-à-list retourne uniquement la liste et de ne pas renvoyer plusieurs valeurs. lire-de-string retourne deux valeurs: La liste et la taille de la chaîne, je pense.
Qui ferait,
"1 2 3 4 5"
, avec une forme comme(read-line stream)
, pour lire une ligne à partir d'un flux encore donner pas une chaîne mais une liste.Je pense que cela peut fonctionner:
Cela fait une liste avec des espaces comme des éléments. Supprimer les espaces:
(#\1 #\2 #\3 #\4 #\5 #\6 #\7)
, j'. e. une liste de chiffres. Aparté: ne passetf
des variables qui n'existent pas.defparameter
oudefvar
pour créer un nouveau à l'échelle mondiale variable spéciale, ou l'utilisationlet
(ou d'autres constructions de l'introduction d'une portée locale) pour créer des variables locales.