8
votes

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? J'utilise Clisp.


3 commentaires

Alors, qu'est-ce que tu essayes exactement de faire? "String to List" pour moi implique d'aller d'une chaîne à une liste de caractères, mais votre exemple lit les choses séparées par des espaces.


Je suis un Newbie Lisp. Et je n'ai pas trouvé "divisé" comme une ampleur. Jusqu'à présent, je peux utiliser "Pays-Integer" pour convertir "123" à 123.


Avec cl-ppcre: (mapcar # 'parse-entier (PPCRE: Split # \ Space "1 2 3"))


7 Réponses :


2
votes

Astuce: Jetez un coup d'œil à avec entrée-from-string .


0 commentaires

2
votes
(with-input-from-string (s "1 2 3 4 5 6 7" :index i :start 0 :end 13)
              (list (read s) (read s) (read s) (read s) (read s) (read s)))
(1 2 3 4 5 6 7)
it works however i feel it is not so elegant as there are many read call .thanks again!

1 commentaires

(avec entrée-de-chaîne (S "1 2 3 4 5 6 7") (boucle pour x = (lecture s nil: extrémité) jusqu'à (EQ x: fin) Recueillir x)) devrait fonctionner, mais noter qu'il faudra "un deux trois" à une liste de symboles plutôt qu'une liste des chaînes.




4
votes

Voici une solution récursive. xxx


0 commentaires

0
votes

qui ferait, xxx


1 commentaires

De plus, dans la forme ci-dessus, dans la première liste, vous pouvez remplacer une chaîne, ici "1 2 3 4 5" , avec un formulaire comme (flux de lecture) , pour lire une ligne d'un flux mais ne cédant pas une chaîne, mais une liste.



1
votes

Je pense que cela pourrait fonctionner:

(setf L-final (remove #\Space L-temp))


4 commentaires

Cela produit la liste (# \ 1 # \ 2 # \ 3 # \ 4 # \ 5 # \ 6 # \ 7) , i. e. une liste de caractères chiffres. Mis à part: ne SETF variables n'existent pas.


Je vois que Svante est correct. J'ai essayé à nouveau et posté la réponse à l'aide de la chaîne de lecture. Je commence toujours à apprendre Lisp. Donc, je suis curieux de ne pas "variables de SETF qui n'existent pas". Est-ce une violation du style fonctionnel? Ou rend-il mon code plus confus dans des programmes plus importants?


Non, ce n'est qu'un comportement indéfini. Vous créez implicitement une variable globale qui peut ou non être spéciale (dynamique). Utilisez Defparamètre ou DEFVAR Pour créer une nouvelle variable spéciale globalement spéciale ou utiliser laisse (ou d'autres constructions introduisant une portée locale) pour créer des variables locales.


J'apprécie votre explication, Svante. Merci.



1
votes

Je vois que Svante a raison. Ma tentative précédente n'a pas fonctionné. Voici une autre tentative. J'utilise concaténate pour modifier la chaîne en une représentation de la liste. Ensuite, j'utilise Lecture à partir de la chaîne pour convertir la chaîne (S-2) en une liste réelle.

(defun from-string-to-list (s)
  (let ((L (read-from-string 
           (concatenate 'string "(" s ")"))))
    L))


0 commentaires