|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Invité de passage
![]() Inscription : avril 2009 Messages : 5 ![]() |
Salut,
j'ai un petit probleme pour trier une liste de nombres rééls sous autolisp je suis partit sur un truc simple " google" http://www.developpez.net/forums/d98...ste-n-element/ mais apparement en autolisp y'a pas les fonction du common lisp ! qui simplifie la vie je planche dessus depuis un peu plus d'une heure je m'arrache les cheveux mais je n'y arrive pas depuis que je les ait coupés Alors on va partir sur un truc tres bourrin Code :
http://www.programcreek.com/2010/10/...ent-in-a-list/ Code :
|
||||
|
|
00
|
|
|
#2 |
|
Invité de passage
![]() Inscription : avril 2009 Messages : 5 ![]() |
|
|
|
00
|
|
|
#3 | ||
|
Invité de passage
![]() Inscription : avril 2009 Messages : 5 ![]() |
Code :
|
||
|
|
00
|
|
|
#4 |
|
Nouveau Membre du Club
![]() Inscription : juillet 2010 Messages : 31 ![]() |
Salut
Et cette solution ? Code :
(mapcar '(lambda(x)(vl-position x l)) (vl-sort l '<)) |
|
10
|
|
|
#5 | ||
|
Membre Expert
![]() Inscription : avril 2008 Messages : 796 ![]() |
Bonjour, je ne comprends pas pourquoi tu ne peux pas utiliser directement la fonction vl-sort telle qu'elle est décrite dans la référence: vl-sort ???
Code :
Il faut donc tester sur un exemple, puis, le cas échéant, appliquer la fonction à une copie de la liste d'origine. Oops! Je crois avoir compris: tu veux retourner l'ordre dans lequel se trouve ta liste d'origine, c'est-à-dire la liste des positions qu'ont ses éléments dans la version triée de la liste, c'est ça? et je plussoie la proposition de Patrick
|
||
|
|
00
|
|
|
#6 | ||||
|
Nouveau Membre du Club
![]() Inscription : juillet 2010 Messages : 31 ![]() |
La fonction vl-sort est très puissante et permet de trier de plusieurs manières
En ordre croissant en utilisant directement la fonction < ou l'inverse avec > pour des listes simples Ou par exemple sur les listes à deux éléments. Un exemple sur le 2em élément d'une liste Code :
Code :
@+ |
||||
|
00
|
|
|
#7 | |||||
|
Membre Expert
![]() Inscription : avril 2008 Messages : 796 ![]() |
Citation:
Ben non, ça marche pas du tout, ton raisonnement! Si la fonction est purement fonctionnelle, il faut effectivement récupérer le résultat pour pouvoir l'utiliser, soit en le passant comme argument à une autre fonction, soit en le stockant quelque part, par exemple dans la 'cell value' d'une variable, sinon il est perdu. Mais si la fonction est destructive, elle va réaffecter les cdr des différents cons, mais ne va certainement pas changer le lien entre le symbole et la cell value qui pointait sur le premier cons de la liste. En conséquence, si le car de la liste était déjà le minimum, il est possible que la variable pointe dorénavant vers la liste triée (car pointant toujours vers le même premier cons), mais ce n'est pas certain (c'est très implementation-dependant). En revanche, si le car de la liste ne pointait pas vers le minimum, il est très peu probable que la variable pointe maintenant vers la liste triée (car les diverses implémentations de 'sort' que j'ai pu observer jusqu'à présent manipulent exclusivement les cdr et jamais les car des cons). Dans certains lisps où la fonction 'sort' est destructive, voici ce que l'on peut généralement obtenir: Code :
Un test pour vérifier la destructivité de sort consiste donc à regarder le contenu de l1 après appel de sort. Pour la petite histoire, j'ai remarqué que beaucoup de "débutants" (ce que je n'applique à personne ici!) ont tendance à "craindre" ce qu'on appelle "effet de bord" et se méfient donc de fonctions comme 'sort' 'setf' 'rplaca' rplacd' 'pop' (CL) ou 'nextl' (Le_Lisp). Cette crainte est souvent amplifiée par la confusion entre effet de bord sur un symbole et effet de bord sur un cons: Code :
Code :
(prog1 (car l1) (setq l1 (cdr l1))) # effet de bord sur le symbole l1 [/chipotage] |
|||||
|
|
00
|
|
|
#8 | |
|
Invité de passage
![]() Inscription : avril 2009 Messages : 5 ![]() |
Citation:
c'est bien de ne pas se prendre la tete a gerer les boucles el les incrementations! |
|
|
|
10
|
|
|
#9 |
|
Nouveau Membre du Club
![]() Inscription : juillet 2010 Messages : 31 ![]() |
@jack-ft
Merci de tes explications, même si je n'ai pas tout compris et pu tester (lisp sur Autocad) Mais une chose me surprend, si une fonction est destructive car elle fait un peu ce qu'elle veut (si j'ai bien compris), ce n'est pas un BUG du langage ? @+ |
|
00
|
|
|
#10 | |||
|
Membre Expert
![]() Inscription : avril 2008 Messages : 796 ![]() |
Citation:
Sauf si on se place dans une vision purement fonctionnelle! En fait, on dit qu'une fonction est destructive lorsqu'elle modifie les données reçues en entrée: Code :
Cette fonction n'est pas fonctionnelle dans le sens (en gros) où l'évaluation de l2 ne rend plus la même chose après le passage de rplaca sur l1. Les fonctions intrinsèquement destructives sont indispensables pour gérer une forme de persistance (comme dans la programmation objet). Une fonction comme 'sort' peut être fonctionnelle ou non. Sa raison de vivre n'est pas de modifier ce qu'elle reçoit, mais de rendre un résultat trié. Si une implémentation de 'sort' décide de rendre une copie triée de la liste qu'elle reçoit, alors elle est fonctionnelle et il faut le dire dans la doc. Si une implémentation de 'sort' décide d'utiliser exactement les cellules de la liste qu'elle reçoit en les modifiant pour rendre une liste triée, alors elle est destructive et il faut le dire dans la doc. La version avec copie est plus lente et sollicite le GC (garbage collector, ramasse-miettes ou glanage des cellules), mais elle est non-destructive. La version avec des rplacd est plus rapide et ne sollicite pas le GC, mais elle est destructive. Lorsque je programmais des outils de composition et d'exécution musicale en temps réel, on faisait la chasse à tout ce qui faisait de l'allocation (comme cons, list, append etc.) car, si cela venait à déclencher le GC, la musique s'arrêtait complètement pendant 2 secondes |
|||
|
|
10
|
|
|
#11 |
|
Invité de passage
![]() Inscription : avril 2009 Messages : 5 ![]() |
par un souci indescriptible je veut savoir - comme c'est mon premier message sur ce site - comment on marque resolue !
|
|
|
00
|
|
|
#12 |
|
Nouveau Membre du Club
![]() Inscription : juillet 2010 Messages : 31 ![]() |
@jack-ft
Ah ok, merci beaucoup C'est bien ce que j'avais compris pour la fonction destructive, qu'elle modifiait les données d'entrées, mais pas tout à fait dans le sens que tu m'as indiqué. C'est plus clair maintenant @+ |
|
00
|
|
|
#13 | |
![]() ![]() Inscription : septembre 2003 Messages : 4 434 ![]() |
Citation:
qui est au milieu de la ligne sous le dernier message dela discussion.
__________________
"La haine seule fait des choix" - Koan Zen "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne. Faites du Prolog, ça vous changera les idées ! Ma page Prolog Mes codes sources commentés Mon avatar : Intérieur avec jeune femme de Vilhelm Hammershoi |
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com