Chaque opération impérative doit préciser tous les effets de l'opération sur l'ensemble des objets passés en arguments. Comme avec les préconditions, la description de ces effets fait le plus souvent référence à l'image mentale du type, mais elle peut également mentionner d'autres opérations du protocole. La description de l'opération de dépilement d'une pile peut par exemple mentionner à la fois que le sommet de la pile sera supprimé et que l'opération size (si elle existe) renvoie désormais une valeur qui vaut un de moins qu'avant.
En particulier, l'un des arguments d'une fonction peut être une valeur structurée comme une liste ou un vecteur. Ces deux types ne sont pas abstraits, mais leur support en Common Lisp (en particulier pour les listes) est tellement universel qu'il est tout à fait acceptable de s'en servir dans le protocole d'un type abstrait. La question se pose alors si l'opération a l'intention de stocker (ou capturer) la liste pour une utilisation ultérieure. Dans ce cas, l'appelant ne doit pas modifier la liste de manière destructive après l'avoir passée en argument.
Si l'opération a l'intention de capturer un argument structuré de cette manière, il est impératif que ce fait soit documenté dans la description de l'opération.
Il est bien sûr plus prudent de ne pas capturer des objets structurés de cette façon ; cependant copier systématiquement les arguments représente un gaspillage considérable d'espace mémoire et de temps d'exécution (y compris pour le ramasse-miettes). La capture est donc courante et c'est la responsabilité de l'appelant de copier la liste ou le vecteur avant de les passer en argument, s'il souhaite les modifier a posteriori.
Irene DURAND