Tableaux ajustables et déplacés

Il est parfois utile de pouvoir changer la taille d'un tableau. Par défaut, make-array crée un tableau dont la taille est fixe. Mais make-array accepte un paramètre mot-clé :adjustable (dont la valeur est donc nil par défaut) permettant de créer un tableau ajustable. Ajuster un tableau signifie la modification d'un certain nombres de paramètres dont le plus important est la taille, à savoir son nombre d'éléments. L'ajustement se fait à l'aide de la fonction adjust-array. Exemples :

* (defparameter *a* (make-array '(2 3)
                                :adjustable t
                                :initial-element 3))

*A*
* *a*

#2A((3 3 3) (3 3 3))
* (adjust-array *a* '(3 2) :initial-element 4)

#2A((3 3) (3 3) (4 4))
* *a*

#2A((3 3) (3 3) (4 4))
*

La norme Common Lisp détermine dans quel ordre les éléments d'un tableau sont stockés en mémoire. Pour cette raison, il est possible d'avoir plusieurs vues d'un tableau avec des rangs différents. Un tableau créé avec le paramètre mot-clé :displaced-to ne contient pas d'éléments propres, mais sera une vue des éléments d'un autre tableau. On parle de tableau déplacé (en Anglais : displaced array). Le paramètre mot-clé :displaced-index-offset permet de déterminer quel élément du tableau d'origine sera considéré comme le premier du tableau déplacé. Exemples :

* (defparameter *a*
    (make-array '(2 3) :initial-contents '((4 2 3)
                                           (5 6 1))))

*A*
* *a*

#2A((4 2 3) (5 6 1))
* (defparameter *b*
    (make-array '(4)
                :displaced-to *a*
                :displaced-index-offset 1))

*B*
* *b*

#(2 3 5 6)
* (setf (aref *a* 1 1) 8)

8
* (setf (aref *b* 1) 9)

9
* *a*

#2A((4 2 9) (5 8 1))
* *b*

#(2 9 5 8)
*

Irene DURAND
2011-10-14