Aller au contenu

MapCar et Lambda, j'essai, mais j'ai du mal...


Messages recommandés

Posté(e)

Bonjour à la communauté.
J'essai de progresser en Lisp, et donc, en listes, et je pense que les fonctions (mapcar et (lambda devrait m'être utiles dans mon cas. Mais je n'en sort pas.
J'ai deux listes, une pour des "lecteurs" et une pour des "chemins", c'est pour faire des recherches dans nos DD.
J'ai donc mes deux listes :

(setq ListLect   '("C:\\" "D:\\" "O:\\" "Z:\\")
      ListChemin '("_OpaleCAD"
                   "_OpaleCAD\\_OpaleGestion"
                   "_OpaleCAD\\Bloc"
                   "_OpaleCAD\\Cartouche"
                   "_OpaleCAD\\Excel"
                   "_OpaleCAD\\Hach"
                   "_OpaleCAD\\Icones"
                   "_OpaleCAD\\Lisp"
                   "_OpaleCAD\\Menu"
                   "_OpaleCAD\\Support"
                   "_OpaleCAD\\VBA"
                  )
) ;_ Fin de setq

Et je pensais à un petit truc dans ce genre :

(setq ListComplet (mapcar '(lambda (ListLect ListChemin) (strcat ListLect ListChemin))))

J'ai bien entendu essayé plusieurs "orthographes" de code... Mais rien, j'ai du mal à conjuguer ces deux super fonctions.
Vous aurez devinés mon but, fouiller certaint répertoires (ListChemin, toujours les mêmes) dans différents lecteurs (ListLect tous différents)...
La structure de ListChemin est la même pour tous nos postes, mais pas les lescteurs (réseaux, locaux, USB, DD...) tous différents selon les PC.

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,

Manifestement, tu n'as pas seulement "du mal à conjuguer ces deux super fonctions", tu as du mal à utiliser chacune séparément.

Apprends d'abord à te servir de mapcar avec des fonctions natives (ou des defun) sur une ou plusieurs listes d'un côté et a comprendre le fonctionnement de lambda d'un autre. Tu pourras ensuite combiner les deux.

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

Posté(e)

Salut @(gile), merci pour ton aide.
J'ai fais de petits exercices (grace à mon PDF de chevet : "introduction à AutoLisp" 😉 et au super site de @didier, j'ai aussi regardé les Lisp de LeeMac, mais là, je n'ai pas le niveau et des postes sur CadXP).
J'avais réussi, il y a longtemps à faire un truc avec ces deux fonctions, mais je n'arrive plus à le retrouver.
Que me conseils-tu ?

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)
il y a 7 minutes, (gile) a dit :

Apprends d'abord à te servir de mapcar avec des fonctions natives (ou des defun) sur une ou plusieurs listes d'un côté

En récursivité ? Si c'est ça, tu me surestimes... 😉

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)

J'avais pensé au début à faire deux (while, l'un dans l'autre ou deux (repeat , mais je pensais que (mapcar et (lambda feraient le boulo.
Mais tu as raison, c'est peut-être hors de ma portée.
Je ferais ce que je saurais peut-être faire, sans faire appel à ce que je ne connais pas.

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 pense que mapcar ne s'applique pas à ce que tu cherches à faire. Néanmoins je pense que comprendre comment agit cette fonction est fondamental dans l'apprentissage du LISP.

Essaye de comprendre ces expressions en les testant dans la console puis en essayant de les modifier:

Avec une liste :

(mapcar 'itoa '(1 2 3 4))

Avec deux listes :

(mapcar '+ (1 2 3) '(4 5 6))

(mapcar 'strcat '("a" "b" "c") '("1" "2" "3" "4" "5"))

Avec un defun :

(defun concatenerChaineEntier (str int) (strcat str (itoa int)))

(concatenerChaineEntier "a" 1)

(mapcar 'concatenerChaineEntier '("a" "b" "c") '(1 2 3))

Avec lambda (compare l'expression lambda avec le defun concatenerChaineEntier):

(mapcar '(lambda (str int) (strcat str (itoa int))) '("a" "b" "c") '(1 2 3))

 

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

Posté(e)

Bonjour @(gile)et merci pour tes explications. Je comprends mieux pourquoi je n'y arrivais pas.
Du coup, j'ai écrit ça :

(setq ListLect   '("C:\\" "D:\\" "O:\\" "Z:\\")
      ListChemin '("_OpaleCAD"
                   "_OpaleCAD\\_OpaleGestion"
                   "_OpaleCAD\\Bloc"
                   "_OpaleCAD\\Cartouche"
                   "_OpaleCAD\\Excel"
                   "_OpaleCAD\\Hach"
                   "_OpaleCAD\\Icones"
                   "_OpaleCAD\\Lisp"
                   "_OpaleCAD\\Menu"
                   "_OpaleCAD\\Support"
                   "_OpaleCAD\\VBA"
                  )
      ListComplet (list)
) ;_ Fin de setq
(foreach Lect ListLect ;boucle sur les lecteurs
  (foreach Chemin ListChemin ;boucle sur les chemins
    (setq ListComplet (append ListComplet (list (strcat Lect Chemin))))
  ) ;_ Fin de foreach
) ;_ Fin de foreach

J'ai trouvé plus judicieux l'utilisation de (foreach.

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 ListLect	  '("C:\\" "D:\\" "O:\\" "Z:\\")
      ListChemin  '("_OpaleCAD"
		    "_OpaleCAD\\_OpaleGestion"
		    "_OpaleCAD\\Bloc"
		    "_OpaleCAD\\Cartouche"
		    "_OpaleCAD\\Excel"
		    "_OpaleCAD\\Hach"
		    "_OpaleCAD\\Icones"
		    "_OpaleCAD\\Lisp"
		    "_OpaleCAD\\Menu"
		    "_OpaleCAD\\Support"
		    "_OpaleCAD\\VBA"
		   )
      ListComplet (apply
		    'append
		    (mapcar
		      '(lambda (lect)
			 (mapcar
			   '(lambda (chemin) (strcat lect chemin))
			   ListChemin
			 )
		       )
		      ListLect
		    )
		  )
)

 

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

Posté(e)

Salut @(gile) et merci pour tes explications.
C'est génial, je commence à comprendre, mais c'est un code hyper concis, je ne pense pas pouvoir recréer un code aussi "parfait", mais je pense comprendre.
Il va me falloir encore du temps pour refaire un truc pareil.
Encore merci à toi.
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)

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é