|
On a
vu qu'il était possible d'associer une valeur à un symbole; cela peut se faire
via l'opérateur d'affectation SETF.
Supposons qu'aucune valeur ne soit encore affectée au symbole Vitesse :
Vitesse
=> erreur!
(SETF vitesse 60)
=> 60
Vitesse
=> 60
(SETF vitesse 100)
=> 100
Vitesse
=> 100
L'opérateur SETF a 2 particularités :
Il n'évalue
pas le premier argument, donc il ne respecte pas la règle générale d'évaluation
d'une expression vue plus haut. SETF,
comme QUOTE et DEFUN, l'opérateur de définition d'une fonction utilisateur, fait
partie des opérateurs dits spéciaux :
ceux-ci ont leurs propres règles d'évaluation. Parmi les primitives du Lisp (c'est-à-dire les opérateurs
définis par la norme du langage), ces opérateurs spéciaux sont minoritaires.
Bien entendu, les fonctions définies à l'aide de DEFUN respectent la règle générale d'évaluation.
Après avoir
renvoyé une valeur, l'opérateur SETF
a un effet persistant en ce sens qu'il a associé de façon permanente une valeur
à un symbole : c'est le principe de l'affectation; on dit aussi que SETF a un effet de bord. C'est une liberté qui est prise par rapport au
modèle de calcul purement fonctionnel où les fonctions n'ont pas d'effet de
bord (la majorité des fonctions Lisp
n'ont pas d'effet de bord, ce qui implique qu'elles n'altèrent pas leurs
arguments).
|