SETQ-SET

Définitions de variable


SETQ

(setq) sert à définir une variable.
Si vous voulez vous donner un genre prononcez "cette quiou".

(setq) signifie "set quote", ce qui signifie que (setq) considère toujours la variable comme étant "quotée", de sorte que la variable n'a pas besoin d'être explicitement "quotée".

Une variable est un symbole et ce qui est important c'est son contenu, la variable va conserver ce contenu tout au long de la session, du moins tant qu'on ne vient pas la vider ou en remplacer le contenu par une autre fonction, une fois définie on va pouvoir agir dessus et s'en servir pour créer ou modifier d'autres variables.

 

Contrairement à bien d'autres langages de programmation AutoLisp n'exige pas que les variables soient typées.
C'est à dire que le "type du contenu" de la variable soit déclaré.
Ou encore : on n'a pas besoin de "déclarer" explicitement et exclusivement que le contenu sera un nombre réel (real), un nombre entier (integer) ou une chaîne de caractères (string) ou tout autre chose

.

Ce n'est ni bien ni mal, c'est une particularité, il suffit de le savoir et donc être vigilant lors de la lecture du contenu de la variable en vue de son traitement, si le contenu est une chaîne de caractères (string) la multiplication de son contenu sera rendu impossible du fait que c'est justement du texte qui est dans la variable et le texte ne se multiplie pas à l'instar des nombres.

On peut définir une variable en faisant référence à une autre :

1
2
3
(setq var1 10) ; initialisation de var1 à la valeur 10
(setq b (* var1 2.5)) ; initialisation de var2 à 10 multiplié par 2.5
;10 étant le contenu de var1 la variable b va contenir la valeur 25

On peut définir plusieurs variables consécutivement avec un seul appel à (setq)
ça ne change que l'affichage et je trouve ça plus joli mais cet avis n'engage que moi

1
2
3
4
5
(setq var1 10 ; initialisation de var1 à 10
      var2 20 ; initialisation de var2 à 20
      var3 30 ; initialisation de var3 à 30
      var4 (+ var1 var2 var3) ; initialisation de var4 au résultat de l'addition de var1 var2 et var3
)

SET

La fonction (set) est quasi-équivalente à la fonction (setq)
Quasi car : on peut l'employer à la place de (setq) à condition de "quoter" le symbole passé en argument.

(set) et (setq) attendent tous les deux un symbole comme premier argument, mais (set) accepte une expression qui renvoie un symbole, contrairement à (setq), comme le montre ce qui suit :

(set 'a 12.0); notez bien la présence de l'apostrophe c'est la "quote"

Renvoie 12.0


Exemple intéressant de l'utilisation de (set)

Extraire les trois valeurs X, Y et Z d'un point sans faire appel à (car), (cadr) et (caddr) :

(setq pt (getpoint "\nCliquez un point\n"))

À la suite de l'appel de cette fonction qui demande de cliquer un point à l'écran la variable pt contient une liste de trois valeurs,
par exemple : (246.906 3198.88 0.0)
Maintenant si on veux mettre la valeur X dans une variable, la valeur Y dans une autre variable et enfin la valeur Z dans une troisième variable on va devoir écrire trois lignes de code :

1
2
3
4
(setq x (car pt)
      y (cadr pt)
      z (caddr pt)
)

Ce qui va renvoyer :
246.906 pour X
3198.88 pour Y
0.0 pour Z

Maintenant la syntaxe avec (set) :

(mapcar 'set '(x y z ) pt)

Et en une seule ligne on obtient exactement la même chose !


Pour afficher la valeur d’une variable à la ligne de commande et vérifier ainsi que sa valeur est bel et bien renseignée il y a deux possibilités :

  • depuis la ligne de commande AutoCAD :
    il suffit d’entrer le nom de la variable précédé d’un point d’exclamation (!).
    Commande : !var1
  • depuis la fenêtre Console Visual LISP (qu'on appelle par F6 dans l'I.D.E) :
    entrer simplement son nom et valider par la touche entrée.


    Variables locales ou pas ?

Dans l'AutoLisp (comme ailleurs en programmation) on nomme "variable" un (symbol) auquel il est attribué une valeur.
Le mot "variable" prend tout son sens car le contenu est variable puisque d'autres variables ou opérations peuvent interagir dessus.
C'est pour cette raison que certaines variables sont locales d'autres globales.

  • Variable LOCALE : ne conserve sa valeur que le temps d'exécution de la fonction, ne peut donc pas être utilisée dans une autre fonction.
  • Variable GLOBALE : conserve sa valeur en dehors de l'exécution de la fonction mais dans la limite de la session AutoCAD, elle peut être utilisée dans une autre fonction.
    Il est possible de chercher à différencier les variables globales des locales dans la façon de les écrire dans le code, par exemple encadrer le nom de la variable  d'étoiles pour les variables globales est une façon assez répandue, il s'agit souvent (mais pas toujours) de valeurs constantes qui passent d'une routine à l'autre, comme ceci :
(setq *90degres* (/ pi 2.0))

Une variable prend de la place en mémoire aussi dès qu'on n'en a plus besoin il peut être intéressant de la vider en lui affectant la valeur nil, sans compter que si elle a été mal déclarée ou pire encore pas déclarée du tout on ne risque pas d'utiliser son ancienne valeur dans une autre fonction par inadvertance ce qui consisterait en un effet de bord.

(setq var1 nil)

Haut de page

retour au menu ENVIRONNEMENT


7 juillet 2017
mise à jour le 23 décembre 2017
mise à jour le 30 septembre 2018.