Nous avons parlé d'expressions, d'évaluation d'expressions, et de valeurs d'expressions. Il est vrai que (pratiquement) toutes les expressions Common Lisp ont une valeur. Mais certaines expressions peuvent aussi avoir des effets de bord, à savoir qu'elles modifient l'environnement global d'une manière plus ou moins permanente. Certaines expressions sont même évaluées pour leurs effets de bord, et non pour leur valeur.
L'expression avec effet de bord la plus souvent utilisée est sans doute l'affectation. Dans ce livre, nous allons utiliser la macro setf exclusivement pour l'affectation. Cette macro prend deux paramètres, le premier étant une place (en particulier une variable) et le deuxième une expression arbitraire. Le premier argument n'est pas évalué (setf ne peut donc pas être une fonction) alors que le deuxième l'est. Exemples :
* *print-level*
NIL
* (setf *print-level* 10)
10
* *print-level*
10
*
Remarques : *print-level* est une variable qui détermine le nombre maximum de niveaux de listes affichés par print. Si sa valeur est nil, il n'y a pas de limitation. La valeur de l'expression d'affectation est la nouvelle valeur de la variable. Cette valeur de retour est rarement utilisée.
Un autre effet de bord dont nous avons souvent besoin est la définition de fonctions. Habituellement, on utilise la macro defun pour ce type de définitions. Le premier argument de la macro est le nom de la fonction à définir, le deuxième une liste de paramètres (souvent des symboles). Les arguments suivants forment une séquence arbitrairement longue (le corps de la fonction) d'expressions à évaluer lors d'un appel à la fonction. Exemples :
* (defun pythagora (x y)
(sqrt (+ (* x x) (* y y))))
PYTHAGORA
* (pythagora 3 4)
5.0
*
Ici, le nom de la fonction est pythagora, les arguments sont x et y et le corps contient une seule expression, (sqrt (+ (* x x) (* y y))).
On remarque l'indentation de l'expression du corps par rapport à la première ligne (2 caractères). Cette indentation est obligatoire et automatiquement suggérée par Emacs.
La valeur de l'expression de définition d'une fonction est le nom de la fonction (un symbole).