Fraid Posté(e) le 29 mai 2018 Posté(e) le 29 mai 2018 Bonjour, Je ne suis pas sure d'avoir bien compris ce qu'est une effet de bord.Pour moi, c'est une variable qui prend une valeur inattendue (ou attendue si on le fait volontairement) à cause d'une fonction qui utilise une variable du même nom.Chose impossible dans certain langages grâce leur interface de développement qui les empêche. En Autolisp, pas de contrôle dans ce sens. Ai je bien compris? et quelle sont les astuces pour les éviter. Merci d'avance pour vos spots luminescent. https://github.com/Fraiddd
x_all Posté(e) le 30 mai 2018 Posté(e) le 30 mai 2018 j'aurai dit pareil...quand j'ai peur je change le nom des variables i devient in ou inc, lstartampion ls2tartampion ect... quelques trucs sur autocad
Patrick_35 Posté(e) le 30 mai 2018 Posté(e) le 30 mai 2018 Salut Un petit tour sur le wiki @+ 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 30 mai 2018 Posté(e) le 30 mai 2018 Salut, Une fonction qui n'a pas d'effet de bord (on parle de "fonction pure"), c'est une fonction qui n'a aucun effet sur son environnement (la fonction parent qui l'appelle ou le programme), comme une fonction mathématique.Elle nécessite généralement des arguments et retourne une valeur, résultat du traitement des arguments. En général, une fonction LISP qui retourne toujours nil est une fonction a effet de bord :(command ...) retourne toujours nil et modifie l'environnement AutoCAD, c'est une fonction a effet de bord.Mais ce n'est si simple :(getvar ...) retourne la valeur de la variable système mais ne modifie rien (c'est une fonction pure)(setvar ...) retourne une valeur (l'argument valeur ou nil) mais modifie l'environnement). Pour les fonctions définies avec defun, si on ne veut pas d'effet de bord avec l'environnement LISP (modification de variables), il faut que toutes les valeurs en entrée (input) soient passées en argument, que toutes les variables définies dans la fonction soient déclarées et que la fonction ait une valeur de retour. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Fraid Posté(e) le 30 mai 2018 Auteur Posté(e) le 30 mai 2018 Merci, Je suis allez voir Wiki avant de poser la question, et m'avait un peu embrouiller pour une fois.Surtout avec la définition de semi effet de bord :unsure: En fait, c'est en inspectant mes vielles fonctions, qui à la base, étais bien rangées, mais maintenant, perdues dans la masse, que le problème se pose. Je vais devoir les reprendre, en vérifiant bien, qu'il n'y est pas de variables BORDéliques..Pa facile, car mon ensemble est constitué d'une vingtaine de Lisps thématiques (polyligne, bloc, texte...) ou sont regroupées mes petites routines.On a beau prévoir une Architecture, au bout d'un moment c'est le foutoir malgré tout.Surtout qu'as mes début, je faisait beaucoup de copier/coller sans savoir vraiment ce que je faisais et l'impact produit sur l'ensemble. Sur le conseil de Gile, je vais encapsuler un maximum. https://github.com/Fraiddd
Patrick_35 Posté(e) le 30 mai 2018 Posté(e) le 30 mai 2018 C'est là où l'on comprend tout l'intérêt de définir ses variables/fonctions en local, voire de créer des fonctions qui renvoient des valeurs pour éviter les variables globales, donc potentiellement des effets de bords.Par exemple(defun c:mon_lisp(/ result total) (defun result (a b c) (+ a b c) ) (setq total (result 2 4 6)) (princ (strcat "Résultat : " (itoa total))) (princ) ) Une manière de tester si je n'ai pas de variables qui traines dans mon lispAvant de lancer le lisp, je fais(setq mes_variables (atoms-family 1)) Je lance mon lisp et je teste toutes les fonctions afin de lancer un max de variables.Une fois fini, je fais(vl-remove-if '(lambda(x)(vl-position x mes_variables)) (atoms-family 1))Et je vois ce qui traine. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
x_all Posté(e) le 30 mai 2018 Posté(e) le 30 mai 2018 bizarre ? je teste ton truc il m'arrive ça MON_LISPRésultat : 12 Commande:Commande: (vl-remove-if '(lambda(x)(vl-position x mes_variables)) (atoms-family 1))("C:MON_LISP" "MES_VARIABLES") je m'attendais à trouver a b c quelques trucs sur autocad
Patrick_35 Posté(e) le 31 mai 2018 Posté(e) le 31 mai 2018 Salut Les variables a b c sont des arguments propres à la fonction, donc local.Le résultat attendu est conforme. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
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