Aller au contenu

Effet de bord


Fraid

Messages recommandés

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.

Lien vers le commentaire
Partager sur d’autres sites

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 -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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 lisp

Avant 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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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é