Aller au contenu

Quid des \"boucles\" en Lisp ?


Messages recommandés

Posté(e)

Bonsoir à tous,

 

Je cherche depuis deux jours...( heures) la façon de faire des "boucles" avec le Lisp...

 

J'ai vu les While.... (tant que...) Mais je n'ai rencontré nul part de GoTo (ou autre chose s'en approchant...

Je me suis donc retrouvé devant le livre de M. Contensou... Et j'en déduis que ce style de boucle est inutile avec ce langage... En effet, je croix curieusement qu'il faut construire la routine de façon à ce qu'elle fasse appelle à elle-même pour remplacer le GoTo.

Mais je tatonne tellement que je me demande si j'avance ou si je fais tout simplement n'importe quoi....

 

 

Si les doyens peuvent éclairer les pauvres novices que nous sommes...

 

Merci...

 

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)

Posté(e)

Salut,

 

On parle en LISP de fonction "itératives" et de fonctions "récursives"

 

Les premières répètent les mêmes actions soit "tant que la condition est remplie" (while ...), soit un nombre défini de fois (repeat ...) soit pour chaque élément d'une liste (foreach ...) et (mapcar ...).

 

Les fonctions récursives sont des des fonctions qui font appel à elles même dans leur propres définitions, créant un "empilement". C'est moins évident à comprendre, mais tellement élégant (avis personnel). Pour t'aider, tu peux utiliser la fonction TRACE dans la console VisualLISP. Par exemple tu charges la fonction FACT (un classique, voir le lien ci-dessous) et tu lances dans la console (trace fact) puis (fact 6) et tu ouvres la fenêtre suivi et tu verras l'empilement.

 

Tu peux aussi voir dans la Faq AutoLISP ce chapitre et le suivant.

 

Et quelques exemples de routines définies de manière itérative et récursive ici et .

 

[Edité le 8/6/2006 par (gile)]

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

Posté(e)

Salut

Tu as quatre manières de faire des boucles (voir cinq avec la méthode récursive)

 

La première avec le while que tu retrouves en vb (de mémoire un while...wend)

ex : (setq test 1)

(while (<= test 10)

.....

(setq test (1+ test))

)

 

La seconde avec le foreach qui parcours une liste et qui le transmet dans une varaible

ex : (foreach n '(a b c) (print n))

 

La troisième avec repeat

ex : (setq a 10 b 100)

(repeat 4 (setq a (+ a 10)) (setq b (+ b 100)))

 

La quatrième avec la fonction mapcar qui appelle une fonction sur une liste

ex : (setq a 10 b 20 c 30)

(mapcar '1+ (list a b c))

 

Et je pourrai en rajouter un dernier avec vlax-for, mais on passe au vlisp ;)

 

@+

 

:o Ah ben, je viens de me faire griller par (gile) :cool:

 

[Edité le 8/6/2006 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)

C'est pas "grillé", nos réponses se complètent ;)

 

Attention quand même, avec WHILE et les fonctions récusives, de s'assurer que la condition fasse qu'à un moment la boucle se termine !

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

Posté(e)

Merci à tous les deux... ( les grillés et les grilleurs.... :P )

 

Bon, je vais apprendre le Yoga et pratiquer le Zen... A cause des fonctions "itératives" et "récursives"... Je croix que je vais avoir du mal... M. Contensou en parlais déjà... Et vous aussi.... Pfffffffff.......... Je n'ai pas fini de bosser avant d'y arriver....

 

Bon....Ouais, je sais je suis lourd... (d'ailleurs, je pense à changer ma signature... ;) ) Mais j'ai encore une question qui traine....

 

Au boulo, On a AutoCAD 2004 et 2005, on a donc VLisp partout... Mais qu'a de plus VLisp ?

 

Merci pour vos réponses... Je buche, je potasse et je décortique... ( je migraine aussi.. ;) )

 

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)

Posté(e)

Merci Gile, tu me donne l'occasion d'apporter ma contribution.... ( Si je ne me fais pas "grillé)

 

Attention quand même, avec WHILE et les fonctions récusives, de s'assurer que la condition fasse qu'à un moment la boucle se termine !

Il faut toujours s'assurer d'une condition "dépassante"... (Bien vu (gile))...

 

C'est ce qu'on appelle un circuit fermé en électronique, une redondance cyclique chez Microsoft (redondance = cyclique, Microsoft aussi, se mort la queue...), un cercle rouge en politique, un cercle vicieux en boite de nuit... Et... Et ? Comment en informatique... ? ? ? Un BUG ! ! ! Oui, le plus gros problème en informatique : l'outil le plus évolué de l'évolution n'est qu'un insecte... Sommes-nous peu de chose....

Ahhhhh, un peu d'humour ne fait pas de mal...

 

Bon, mas brève contribution, si elle est juste, s'arrête déjà... Et, j'en suis sûr sera reprise....

 

Merci à tous.... ;)

 

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)

Posté(e)

J'ai un petit problème, (gile)

 

Dans ta fonction

(defun SOME  (fun lst)
 (and (consp lst)
      (member T (mapcar fun lst))
      )
 )

 

Il y a and, et je ne trouve pas d'aide dessus, ni AutoCAD ni VLisp... ? Pourquoi ?

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)

La fonction and est renseignée, comme les autres fonctions LISP, dans l'Aide aux développeurs -> AutoLISP Reference -> AutoLISP functions -> A Functions. Elle est aussi bien expliquée dans AIDACAD.

 

L'expression :

 

(and (consp lst)

(member T (mapcar fun lst))

)

 

teste d'abord si lst est une liste non vide (consp lst), si ce n'est pas le cas, cesse l'évaluation et retourne nil, si oui continue l'évaluation et teste si un des éléments de lst retourne T à la fonction fun (member T (mapcar fun lst)), si cette dernière expression retourne nil l'expression complète (and ...) retourne nil, si la première expression ET la deuxième expression contenues dans le (and .. ) retournent T alors (and ... ) retourne T.

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

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é