Caleb Posté(e) le 26 avril 2016 Posté(e) le 26 avril 2016 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
Tramber Posté(e) le 26 avril 2016 Posté(e) le 26 avril 2016 (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 ./__\. (.°=°.)
Tramber Posté(e) le 26 avril 2016 Posté(e) le 26 avril 2016 (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 ./__\. (.°=°.)
Patrick_35 Posté(e) le 26 avril 2016 Posté(e) le 26 avril 2016 (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é le 26 avril 2016 par Patrick_35 Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 26 avril 2016 Posté(e) le 26 avril 2016 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
Caleb Posté(e) le 26 avril 2016 Auteur Posté(e) le 26 avril 2016 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
Tramber Posté(e) le 26 avril 2016 Posté(e) le 26 avril 2016 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 ./__\. (.°=°.)
Patrick_35 Posté(e) le 27 avril 2016 Posté(e) le 27 avril 2016 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Tramber Posté(e) le 27 avril 2016 Posté(e) le 27 avril 2016 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 ./__\. (.°=°.)
(gile) Posté(e) le 27 avril 2016 Posté(e) le 27 avril 2016 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
Caleb Posté(e) le 27 avril 2016 Auteur Posté(e) le 27 avril 2016 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
Tramber Posté(e) le 27 avril 2016 Posté(e) le 27 avril 2016 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 ./__\. (.°=°.)
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant