Aller au contenu

[Résolu] Ajout de paire pointées dans une liste


Messages recommandés

Posté(e)

Bonjour à tous.

 

Aujourd'hui, j'essai d'ajouter des paires pointées à une liste de ... paires pointées..

 

J'ai ça :

(setq LstEntete (cons Lst "Aucun"))

Qui me donne bien :

_$ LstEntete

(1 . "Aucun")

Mais je n'arrive pas à ajouter des paires pointées à cette liste :

(setq LstEntete ((list LstEntete (cons Lst Entete))))

ou j'ai maintenant :

_$ (cons Lst Entete)

(2 . "Bâtiments")

Bien sur, Lst est incrémenté quelque-part entre ces lignes...

 

J'ai lu et relu "Introduction_a_AutoLISP" de (gile), mais je crois que je tourne en rond...

 

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

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)

(setq LstEntete ((list LstEntete (cons Lst Entete))))

Tu as déjà une paire de parenthèses en trop dans ta ligne.

(setq LstEntete (list LstEntete (cons Lst Entete)))

Aide au téléchargement du cadastre dgfip-download-helper
Insertion de photos géolocalisées exif https://www.dropbox.com/s/gkf6o9ac2hxen97/exifscr.zip?dl=0
Script correction BUG SPDC V2, propriétaire département 21 et 22 : https://greasyfork.org/scripts/442400-spdcv2/code/SPDCV2.user.js

Posté(e)

Salut Vincent, et merci pour ton aide.

 

Ça fonctionne presque ! Le résultat est :

_$ LstEntete

(((((((((((((((((((((((((((((((((((1 . "Aucun") (2 . "Bâtiments")) (3 . "Cadastre")) (4 . "Chemin de fer")) (5 . "Clôture")) (6 . "Courbes de niveaux")) (7 . "Jeux")) (8 . "Mobilier Urbain")) (9 . "Repère")) (10 . "Signalisation horizontale")) (11 . "Signalisation verticale")) (12 . "Talus")) (13 . "Titre")) (14 . "Topographie")) (15 . "Végétation")) (16 . "Détection Arrosage")) (17 . "Détection Assainissement")) (18 . "Détection Chaleur / Calorifuge")) (19 . "Détection Produits Chimiques")) (20 . "Détection Eau Pluviale")) (21 . "Détection Eau Potable")) (22 . "Détection Eau Usée")) (23 . "Détection Éclairage Public")) (24 . "Détection Électrique (BT + HT)")) (25 . "Détection Électrique BT")) (26 . "Détection Électrique HT")) (27 . "Détection Fibre optique")) (28 . "Détection Gaz")) (29 . "Détection Multiples")) (30 . "Détection Non Identifié")) (31 . "Détection Signalisation Lumineuse Tricolore")) (32 . "Détection Télécommunication")) (33 . "Détection Téléreport")) (34 . "Détection Unitaire")) (35 . "Détection Vidéo"))

 

Il y a des listes DANS des listes, toutes pointées...

 

Une idée ?

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) (modifié)

Bonjour,

 

Une liste se construit par la tête "car" si tu utilises la fonction de constructeur de liste cons, sinon utilise append si tu veux mettre des listes bout à bout...

 

 

;; Créer une paire pointée 
(setq dotpair (cons 1 "toto"))  -> (1 . "toto")

;; Créer une liste contenant une paire pointée 
(setq lstdotpair (cons dotpair nil)) -> ((1 . "toto"))
;; ou
(setq lstdotpair (list dotpair )) -> ((1 . "toto"))

;; Ajouter une paire pointé à la liste de paire pointée
(setq lstdotpair (cons (cons 2 "titi") lstdotpair)) -> ((2 . "titi") (1 . "toto"))

 

 

A l'occasion je t'invite à relire cette discussion http://cadxp.com/topic/29314-ces-listes-qui-nen-sont-pas/page__view__findpost__p__159425

 

A+

Modifié par VDH-Bruno

Apprendre => Prendre => Rendre

Posté(e)

Salut Bruno...

 

Mille merci, c'est nickel... A part l'ordre invers, mais je ne pense pas que ça posera problème avec un (assoc...

 

Encore merci à tous...

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 Bruno...

 

Mille merci, c'est nickel... A part l'ordre invers, mais je ne pense pas que ça posera problème avec un (assoc...

 

Encore merci à tous...

 

D'où l'utilité de travailler avec assoc et les paires pointées, comme dans les codes dxf.

Sinon la fonction reverse est ton amie

 

_$ (reverse '((2 . "titi") (1 . "toto")))
((1 . "toto") (2 . "titi"))

 

A+

Apprendre => Prendre => Rendre

Posté(e)

Salut.

 

Merci Bruno pour ton aide. Mais je n'arrive pas à inverser ma liste par son nom, j'ai essayé plusieurs de trucs :

_$ LstEntete
((35 . "Détection Vidéo") (34 . "Détection Unitaire") (33 . "Détection Téléreport") ......
_$ (reverse '(LstEntete))
(LSTENTETE)
_$ (reverse (LstEntete))
_$ LstEntete
((35 . "Détection Vidéo") (34 . "Détection Unitaire") (33 . "Détection Téléreport") ......
_$ (reverse (list (LstEntete)))
_$ LstEntete
((35 . "Détection Vidéo") (34 . "Détection Unitaire") (33 . "Détection Téléreport") ......
_$ (reverse LstEntete)
; erreur: liste incorrecte: "Aucun"
_$ (reverse 'LstEntete)
; erreur: type d'argument incorrect: listp LSTENTETE
_$ (reverse (list LstEntete))
(((35 . "Détection Vidéo") (34 . "Détection Unitaire") (33 . "Détection Téléreport")......
_$ LstEntete
((35 . "Détection Vidéo") (34 . "Détection Unitaire") (33 . "Détection Téléreport")...... [/Code]

 

Rien ne fonctionne et je n'ai vraiment pas l'habitude des listes...

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,

 

LstEntete est une "variable" à laquelle tu as assigné une liste (pls précisément, un symbole auquel tu as attaché une valeur de type liste).

Donc passer la "variable" (le symbole) à une fonction est équivalent à passer sa valeur (la liste) à la fonction.

 

(reverse '(1 2 3))  ; => (3 2 1)

(setq lst '(1 2 3)) ; => (1 2 3)

(reverse lst)       ; => (3 2 1)

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

Posté(e)

Bonjour (gile), et merci pour ton aide.

 

Mais si je fais ce qui suit, la console me sort une erreur :

_$ LstEntete
((35 . "Détection Vidéo") (34 . "Détection Unitaire")  ......  (2 . "Bâtiments") 1 . "Aucun")
_$ (reverse LstEntete)
; erreur: liste incorrecte: "Aucun"

 

Je viens de voir qu'il manque une parenthèse avant la dernière paire 1 . "Aucun".

 

Tu as une idée ? Car là, je rame... ;)

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)

Regarde bien ta liste, la dernière paire pointée n'en est pas une :

((35 . "Détection Vidéo") (34 . "Détection Unitaire") ...... (2 . "Bâtiments") 1 . "Aucun")

 

il faudrait :

((35 . "Détection Vidéo") (34 . "Détection Unitaire") ...... (2 . "Bâtiments") (1 . "Aucun"))

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

Posté(e)

Merci (gile), c'est ce que je viens de voir dans le message #9.

 

Mais où je me suis trompé dans la construction de ma liste ?

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)

Je ne sais pas comment tu as construit ta liste, mais tu peux faire quelque chose comme ça :

 

(setq l	'("Aucun"
  "Bâtiments"
  "Cadastre"
  "Chemin de fer"
  "Clôture"
  "Courbes de niveaux"
  "Jeux"
  "Mobilier Urbain"
  "Repère"
  "Signalisation horizontale"
  "Signalisation verticale"
  "Talus"
  "Titre"
  "Topographie"
  "Végétation"
  "Détection Arrosage"
  "Détection Assainissement"
  "Détection Chaleur / Calorifuge"
  "Détection Produits Chimiques"
  "Détection Eau Pluviale"
  "Détection Eau Potable"
  "Détection Eau Usée"
  "Détection Éclairage Public"
  "Détection Électrique (BT + HT)"
  "Détection Électrique BT"
  "Détection Électrique HT"
  "Détection Fibre optique"
  "Détection Gaz"
  "Détection Multiples"
  "Détection Non Identifié"
  "Détection Signalisation Lumineuse Tricolore"
  "Détection Télécommunication"
  "Détection Téléreport"
  "Détection Unitaire"
  "Détection Vidéo"
 )
)
(setq i 0)
(setq LstEntete nil)
(foreach n l
 (setq	i	  (1+ i)
LstEntete (cons (cons i n) LstEntete)
 )
)
(setq LstEntete (reverse LstEntete))

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

Posté(e)

Que dire... Nickel...

 

J'ai toujours des problèmes dès que je touche aux listes... Ce qui est un comble, je l'avoue, en LISP. :huh:

 

Merci mille fois Maître (gile)...

 

Non, le titre "Maître" n'est pas usurpé... ;)

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)

Non, le titre "Maître" n'est pas usurpé... ;)

Et moi qui aspire à n'avoir ni Dieu ni maître...

 

De manière plus "fonctionnelle" on peut aussi faire :

 

(setq l '("Aucun"
         "Bâtiments"
         "Cadastre"
         "Chemin de fer"
         "Clôture"
         "Courbes de niveaux"
         "Jeux"
         "Mobilier Urbain"
         "Repère"
         "Signalisation horizontale"
         "Signalisation verticale"
         "Talus"
         "Titre"
         "Topographie"
         "Végétation"
         "Détection Arrosage"
         "Détection Assainissement"
         "Détection Chaleur / Calorifuge"
         "Détection Produits Chimiques"
         "Détection Eau Pluviale"
         "Détection Eau Potable"
         "Détection Eau Usée"
         "Détection Éclairage Public"
         "Détection Électrique (BT + HT)"
         "Détection Électrique BT"
         "Détection Électrique HT"
         "Détection Fibre optique"
         "Détection Gaz"
         "Détection Multiples"
         "Détection Non Identifié"
         "Détection Signalisation Lumineuse Tricolore"
         "Détection Télécommunication"
         "Détection Téléreport"
         "Détection Unitaire"
         "Détection Vidéo"
        )
)
(setq i 0)
(setq LstEntete (mapcar '(lambda (x) (cons (setq i (1+ i)) x)) l))

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

Posté(e)

Et moi qui aspire à n'avoir ni Dieu ni maître...

Tu n'en n'as pas, tu en es un... Nuance. ;)

 

Je me doutais bien qu'intervenir sur une liste depuis une autre, tu allais finir par le couple mapcar / lambda...

 

Effectivement, ça me met le pied à l'étrier...

 

Encore un grand merci à toi...

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)

Je me doutais bien qu'intervenir sur une liste depuis une autre, tu allais finir par le couple mapcar / lambda...

 

C'est précisément le propos de mapcar que de retourner la liste des résultats de l'exécution d'une fonction sur chacun des élément d'une liste.

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

Posté(e)

 

Je me doutais bien qu'intervenir sur une liste depuis une autre, tu allais finir par le couple mapcar / lambda...

 

 

Effectivement pour retourner une liste depuis une liste le couple mapcar/lambda est une évidence, mais les fonctions récursives aussi car elles empilent et dépilent les appels de la même manière qu'est construite une liste..

 

 

(defun indLst (i l)
 (if l
   (cons (cons i (car l)) (indLst (1+ i) (cdr l)))
 )
)

_$ (indLst 1 '("tata" "toto" "titi" "tutu"))
((1 . "tata") (2 . "toto") (3 . "titi") (4 . "tutu"))

 

A+ Bruno

Apprendre => Prendre => Rendre

Posté(e)

Salut Bruno, et merci 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é