Aller au contenu

Messages recommandés

Posté(e)

Bonjour,

 

Je cherche à employer la fonction mapcar, pour la recherche de maximums :

(mapcar 'max '(2 7 5) '(8 0 4))

 

Petit soucis, mes listes / mes arguments sont contenus... dans une liste, et en quantité variable.

Comment "lui faire comprendre" que

(mapcar 'max toto)

c'est pareil, avec toto ma liste d'arguments ?

Conçoit et développe un outil de calcul de ligne pour remontées mécaniques (téléskis, télésièges, télécabines...) en AutoLISP

Posté(e)

(mapcar (function(lambda(x)(car(vl-sort x '>)))) '((2 7 5) (8 0 4)))

 

Obligé de passer par une fonction lambda dans ma première approche.

J'ai écarté l'utilisation de max. La raison est que le nombre d'argument étant non défini, l'appliquer serait compliqué.

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

(mapcar (function(lambda(x)(eval (append (list 'max) x)))) '((2 7 5) (8 0 4)))

En me forçant un peu ;)

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e) (modifié)

Salut

 

Pour regrouper les listes

(apply 'append (list '(1 0 7) '(2 8 3) '(5 9 6)))

 

Reste plus qu'a sortir la valeur max

(apply 'max (apply 'append (list '(1 0 7) '(2 8 3) '(5 9 6))))

 

Ou pour répondre comme Tramber

(mapcar '(lambda(x)(apply 'max x)) (list '(1 0 7) '(2 8 3) '(5 9 6)))

 

@+

Modifié par Patrick_35

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,

 

Si je comprends la demande, c'est un classique, une des plus belles expressions LISP à mon avis.

Il s'agit de passer mapcar à une liste de liste.

 

(apply 'mapcar (cons 'max lst))

 

(apply 'mapcar (cons 'max '((2 7 5) (8 0 4))))) retourne (8 7 5) comme :

(mapcar 'max '(2 7 5) '(8 0 4))

 

(apply 'mapcar (cons 'max '((2 7 5) (8 0 4) (9 2 7)))) retourne (9 7 7) comme :

(mapcar 'max '(2 7 5) '(8 0 4) '(9 2 7))

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

Posté(e)

Tramber et Patrick_35, ce n’est pas exactement ce que je recherchais, mais je vous remercie beaucoup d’avoir pris le temps de me répondre et de m’expliquer.

 

Admettons que je recherche les maximums de

‘((8 3 4) (4 6 8) (1 0 8)) > (8 6 8)

Par défaut, c’est

(mapcar ‘max ‘(8 3 4) ‘(4 6 8) ‘(1 0 8))

Sauf que, cette instruction est en fin de programme : les arguments de mapcar sont de quantité, de taille et de contenance inconnues avant exécution. Seule certitude, les arguments / listes sont contenus dans une liste.

La question, c’est comment alimenter mapcar à partir d’une liste de listes et non des listes prédéfinies (je ne sais pas si je suis clair).

 

Par contre, GillesCAD a visé juste : c’est exactement ce que je recherchais.

Conceptuellement, ce n’est pas évident à appréhender (je marine encore un peu, et si vraiment c'est pas clair, je fais signe). Un grand merci !

Conçoit et développe un outil de calcul de ligne pour remontées mécaniques (téléskis, télésièges, télécabines...) en AutoLISP

Posté(e)

Non, moi je crois que je n'ai rien compris.

La prochaine fois, fais un exemple du résultat attendu.

Pour ta question sur les listes de listes, je suis perdu .... aussi B)

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

Salut

 

J'ai du mal à comprendre. Tu indiques que (gile) à répondu à ta demande (ce qui est le principal), mais ni Tramber et moi.

Pourtant, si tu regardes les réponses, les résultats sont les mêmes que ceux de (gile) ?

 

@+

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)

Si je comprends la demande, c'est un classique, une des plus belles expressions LISP à mon avis.

Il s'agit de passer mapcar à une liste de liste.

(apply 'mapcar (cons 'max lst))

Ok pour les réponses de Patrick_35 mais là c'est vrai que c'est tellement beau que je ne l'ai pas encore compris tout à fait.

Disons que si, j'ai compris, mais comment y penser. C'est toujours là que le bas blesse pour moi.

Pour Caleb, il a toute la gamme de l'intelligence de CADxp B)

C'est vrai que max et d'autres attend une liste à longueur inconnue. Le problème est bien identifié par l'auteur du sujet. Bravo déjà.

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

Salut,

 

Ce type d'expression est plus "facile" à comprendre qu'à construire. Je ne l'ai pas trouvé tout seul, c'est probablement l’œuvre d'un des pionniers d'AutoLISP (époque Reini Urban) ou du LISP (époque John McCarthy).

 

Il illustre bien la manière dont LISP traite les fonctions de la même manière que d'autres types données pour construire des listes qui sont des applications de fonctions.

Pour comprendre cette construction, on peut partir de la demande de Caleb en cherchant à "isoler" les sous-listes dans une liste :

(mapcar 'max '(2 7 5) '(8 0 4))

Il s'agit d'appliquer la fonction mapcar à la liste '(max (2 7 5) (8 0 4)), autrement dit:

(apply 'mapcar '(max (2 7 5) (8 0 4)))

Et on peut construire la liste '(max (2 7 5) (8 0 4)) à partir d'une liste qui ne contiendrait que les sous-listes :

(cons 'max '((2 7 5) (8 0 4)))

Ce qui donne :

(apply 'mapcar (cons 'max '((2 7 5) (8 0 4))))

 

Avec AutoLISP, on utilise ce type d'expression surtout pour traiter des listes de points ou de vecteurs.

 

;; "bounding box" d'une lste de points
(setq minPoint (apply 'mapcar (cons 'min points)))
(setq maxPoint (apply 'mapcar (cons 'max points)))

;; somme d'une liste de vecteurs
(apply 'mapcar (cons '+ vecteurs))

;; transposition d'une matrice
(apply 'mapcar (cons 'list matrice))

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

Posté(e)

Salut

 

J'ai du mal à comprendre. Tu indiques que (gile) à répondu à ta demande (ce qui est le principal), mais ni Tramber et moi.

Pourtant, si tu regardes les réponses, les résultats sont les mêmes que ceux de (gile) ?

 

@+

 

Non justement.

Soit cette liste :

((2 7 5) (8 0 4))

 

Si j'applique tes instructions ou celles de Tramber à cette liste, j'obtiens :

(7 8)

Soit le maximum de chaque liste.

 

 

Si j'applique les instructions de Giles, j'obtiens :

(8 7 5)

 

En fait, je cherche à comparer tous les 1er éléments de chaque liste entre eux et trouver le max, puis les 2nd éléments, et ainsi de suite.

 

 

Faut admettre que c'est pas évident à expliquer.

Sinon j'ai compris le "concept" de l'instruction de Giles : on alimente 'mapcar d'une liste constituée de l'instruction 'max puis des listes passées comme argument

Conçoit et développe un outil de calcul de ligne pour remontées mécaniques (téléskis, télésièges, télécabines...) en AutoLISP

Posté(e)

Ca valait le coup va, j'ai compris la demande maintenant.

Et puis on a eu un rappel à retenir, encore un. Faudrait vraiment que je me fasse un cahier.

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)

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é