Création de sous-listes

Une opération de base sur les listes est la création d'une sous-liste à partir d'une liste donnée. Ceci est possible grâce à la fonction subseq. Comme son nom l'indique, elle s'applique non seulement à des listes, mais aussi à des séquences arbitraires (voir section 9.1.3). Elle prend trois paramètres, dont le dernier est facultatif ; le premier paramètre correspond à la liste, le deuxième à la position de début de la sous-liste. Cette position indique le premier élément inclus dans la sous-liste (0 étant le premier élément de la liste). Le troisième paramètre indique le premier élément de la liste non inclus dans la sous-liste. Une valeur de nil pour ce paramètre équivaut à la longueur de la liste et sera la valeur par défaut. La fonction subseq n'est pas desctructive. Exemples :

* (subseq '(a b c d) 0)

(A B C D)
* (subseq '(a b c d) 2)

(C D)
* (subseq '(a b c d) 1)

(B C D)
* (subseq '(a b c d) 1 nil)

(B C D)
* (subseq '(a b c d) 1 4)

(B C D)
* (subseq '(a b c d) 1 3)

(B C)
*

Il est possible d'utiliser subseq avec setf afin de remplacer destructivement une sous-liste par une autre liste :

* (defparameter *l* (list 1 2 3 4 5 6))

*L*
* *l*

(1 2 3 4 5 6)
* (setf (subseq *l* 2 4) '(a b))

(A B)
* *l*

(1 2 A B 5 6)
*

Si les deux listes (la sous-liste à remplacer et la liste qui doit la remplacer) n'ont pas la même longueur, la plus courte des deux détermine le résultat :

* (defparameter *l* (list 1 2 3 4 5 6))

*L*
* *l*

(1 2 3 4 5 6)
* (setf (subseq *l* 3) '(a b c d e f g))

(A B C D E F G)
* *l*

(1 2 3 A B C)
*

Irene DURAND
2011-10-14