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)
*