Entiers

Les entiers Common Lisp correspondent aux entiers d'autres langages, sauf qu'en Common Lisp il n'y a aucune limitation sur la taille des entiers, à savoir que la seule limitation concernant la taille d'un entier est la taille de la mémoire de l'ordinateur.

La représentation externe d'un entier est une suite de chiffres avec un signe initial facultatif. Exemple :

* 123

123
* +234

234
* -029384029384029384029384203949348503945

-29384029384029384029384203949348503945
*

On remarque que print n'affiche ni le signe + facultatif, ni les zéros non significatifs d'un entier.

Il est important de comprendre la différence entre une suite de chiffres tapée sur le clavier et donnée à read et un nombre qui est un objet Common Lisp en représentation interne. La fonction read est chargée de la conversion entre les chiffres et le nombre. Ceci est encore plus explicite si l'on considère l'existence de la variable *read-base* qui est utilisée pour déterminer la base (normalement 10) utilisée par read pour la conversion :

* 13

13
* (setf *read-base* 8)

8
* 13

11
*

Ici l'expression (setf *read-base* 8) est une expression composée (voir section 4.3) dont l'effet est de modifier la valeur de la variable *read-base*.

Exercice (simple, bref) : Dans la suite d'interactions suivante on essaie d'affecter temporairement *read-base* à 8 (sa valeur est 10 initialement), lire un nombre, puis de réaffecter *read-base* à 10.

* (setf *read-base* 8)

8
* 234

156
* (setf *read-base* 10)

8
* 234

156
*

La réaffectation semble ne pas se faire. Pourquoi?

Exercice (moyen, bref) : Expliquer la différence entre les deux interactions suivantes, en particulier pourquoi dans le premier exemple la base semble ne pas changer pendant la lecture de 234 :

* (let ((*read-base* 8)) 234)

234
* (let ((*read-base* 8)) (read)) 234

156
*

Irene DURAND
2011-10-14