Aller au contenu

Ajout de string dans une liste


Messages recommandés

Posté(e)

Bonjour à tous.

 

Aujourd'hui, je tente de lire une liste de ligne, dans un fichier ASCII, que j'ajoute dans une liste.

Le contenu de mon fichier est :

;Liste des dessinateurs : Prénon NOM;Genre (H=Homme / F=Femme)

Alexandra XXXX;F

Annie YYYYY;F

Denis ZZZZZ;H

Et mon code est :

(defun c:testFich (/ fichier File Lign FichLstDess LignDess LstDess)
 (setq fichier (findfile "Doss_IC_Dess.DenisH"))
 (princ (strcat "\nFichier : " fichier "\n"))
 (setq File (open Fichier "r"))
 (while (setq Lign (read-line File))
   (if (/= (substr Lign 1 1) ";")
     (progn (setq FichLstDess (list FichLstDess Lign))
            (setq LignDess (str2lst Lign ";"))
            (setq LstDess (list LstDess (car LignDess)))
     ) ;_ Fin de progn
   ) ;_ Fin de if
 ) ;_ Fin de while
 (close File)
 (princ (strcat "\nFichLstDess : " FichLstDess "\n"))
 (princ (strcat "\nLstDess : " LstDess "\n"))
 (princ)
)

Mon problème : je n'arrive pas à ajouter des string dans mes listes... AutoCAD me répond :

Commande: TESTFICH

Fichier : C:\config\autocad\lisp\Doss_IC_Dess.DenisH

; erreur: type d'argument incorrect: stringp (((nil "Alexandra XXXX;F") "Annie YYYYY;F") "Denis ZZZZZ;H")

Commande:

 

L'aide en anglais ne me dit pas grand chose...

 

J'ai essayé avec des (append, (list, (cons...

 

Si quelqu'un a une astuce, une idée, un conseil... Je suis preneur...

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Salut

 

Comment est ta liste ?

De cette manière ?

'(("Liste des dessinateurs" ("Alexandra" "XXXX" "F") ("Annie" "YYYYY" "F") ("Denis" "ZZZZZ" "H"))

("Liste autre" ("Toto" "XXXX" "H") ("Titi" "XXXX" "F") ("Gros Minet" "XXXX" "H"))

)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Salut Patrick.

 

En fait, j'aimerais construire mes listes de cette façon :

FichLstDess => ("Alexandra XXXX;F" "Annie YYYYY;F" "Denis ZZZZZ;H")

LstDess => ("Alexandra XXXX" "Annie YYYYY" "Denis ZZZZZ")

Mais j'ai du mal à ne pas faire une liste dans une liste... :huh:

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Lâche-toi. Le tout est de savoir la gérer ensuite.

Merci pour les encouragements, mais j'ai déjà du mal avec un fichier ASCII, alors avec Excel...

 

C'est pô gagné... ;)

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Salut,

 

La fonction cons est, avec car et cdr un des fondements de tous les langages LISP qui sont basés sur le traitement des listes (LISt Processing).

Voir ce sujet.

 

Ce sachant, il est généralement préférable de construire une liste avec cons quitte à inverser la liste une fois qu'elle est finalisée.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Bonjour

 

si tu veux ajouter un élément à une liste, ajoute lui une liste constituée de l'élément

(setq lsElt nil)
(setq lsElt (append lsElt (list "aaa")))
(setq lsElt (append lsElt (list "bbb")))
(setq lsElt (append lsElt (list "ccc")))

 

ton objet lsElt vaut ("aaa" "bbb" "ccc")

 

Olivier

Posté(e)

Salut, et merci à vous...

 

Je "commence" à comprendre ce foutu phénomène de liste... (je n'ai jamais appris à développer...ça explique peut-être celà... Bien que je ne dois pas être le seul... ;) )

 

J'entame une procédure de teste pour mieux les appréhender... Mais ce n'est pas évident...

 

(setq ListOB "aaa" "bbb")
(car ListOB) ==> "aaa"
(cdr ListOB) ==> ("bbb")

 

Le premier est une chaine, ok... Mais pourquoi "aaa" et pas ("aaa") ?...

Le second cdr est.. une liste... Difficile à comprendre, bien que très logique... car cdr est bien la liste exclue du premier élément... donc une liste...

 

Mais comment "choper" le second élément pour qu'il soit une chaine...(cadr ? (nth 2 ? Quel est le plus concis ? Dans l'excellent "Introduction au Lisp" de maître (gile), on voit :

(cdr '(6 1 8) retourne : (1 8)

Et en même temps :

(setq lst '((1 2 3) (4 5 6) (7 8 9)))

(caddar lst) retourne : 3

C'est là que c'est déroutant... Pourquoi caddar lst n'est pas (3) mais 3 ? ?

 

Perso, je trouve ça "curieux"... Mais ce n'est pas très grave (bien que)... Car petit à petit, j'arrive à faire ce que je veux... J’essaierai de "démocratiser" ce que je tente de faire... : lire une liste de nom lue dans un fichier Excel (xls) et en faire le tri avec pour "tri primal", la colonne A, et les Prénom NOM dans la colonne B... Je m'étendrais un peu plus quand ça sera terminé...

(au passage, merci à Patrick_35 pour son aide entre AutoLisp et Excel...)

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Salut,

 

(setq lst '((1 2 3) (4 5 6) (7 8 9)))

(caddar lst) retourne : 3

 

(caddar lst)

est un raccourci pour :

(car (cdr (cdr (car '((1 2 3) (4 5 6) (7 8 9)))))))

=>

(car (cdr (cdr '(1 2 3))))

=>

(car (cdr '(2 3)))

=>

(car '(3))

=>

3

 

nth permet d'obtenir le nième élément d'une liste, mais comme les liste LISP sont des listes dites "chainées" on n'accède au nième element d'une liste depuis le premier.

(setq lst '(0 1 2 3 4 5 6 7 8 9))

(nth 5 lst)

retourne 5 mais en interne c'est le résultat de:

(car (cdr (cdr (cdr (cdr (cdr lst))))))

qu'on aurait aussi pu écrire :

(caddr (cdddr lst))

Autrement dit, la fonction nth pourrait être définie comme ça :

(defun _nth (n lst)
 (car (repeat n (setq lst (cdr lst))))
)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Salut (gile), et merci pour ta réponse...

 

En fait, j'utilise souvent (nth car mes listes sont "formatées"...

 

Elles ont toutes le même nombre d'éléments...

 

Merci encore pour cette précision...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité