17.5 Указатели заполнения

Common Lisp предоставляет несколько функций для управления указателями заполнения. Они позволяют последовательно заполнять содержимое вектора. А если точнее, они позволяют эффективно менять длину вектора. Например, строка с указателем заполнения имеет большинство характеристик строки с переменной длиной из PL/I.

Указатель заполнения является неотрицательным целым числом не большим чем общее количество элементов в векторе (полученное от array-dimension). Указатель заполнения указывает на «активные» или «заполненные» элементы вектора. Указатель заполнение отображает «активную длину» вектора. Все элементы вектора, индекс которых меньше чем указатель заполнения, являются активными. Остальные элементы являются неактивными. Почти все функции, которые оперируют содержимым вектора, будут оперировать только активными элементами. Исключением является aref, которая может получать доступ ко всем элементам массива, активным и неактивным. Следует отметить, что элементы вектора из неактивной части тем не менее являются частью вектора. __________________________________________________________________

Заметка для реализации: An implication of this rule is that vector elements outside the active region may not be garbage-collected.

___________________________________________________________________________________________________________

Указатели заполнения могут иметь только вектора (одномерные массивы). Многомерные массивы не могут иметь указатели заполнения. (Следует отметить, однако, что можно создать многомерный массив соединённый с вектором, у которого есть указатель заполнения.)

[Функция] array-has-fill-pointer-p array

Аргумент должен быть массивом. array-has-fill-pointer-p возвращает t, если массив умеет указатель заполнения, иначе возвращает nil. Следует отметить, что array-has-fill-pointer-p всегда возвращает nil, если массив array не одномерный.


[Функция] fill-pointer vector

Данная функция возвращает указатель заполнения вектора vector. Если вектор vector не имеет указателя заполнения, генерируется ошибка.

Для изменения указателя заполнения вектора может использоваться функция setf в связке с fill-pointer. Указатель заполнения вектора должен быть всегда целым числом между нулём и размером вектора (включительно).


[Функция] vector-push new-element vector

Аргумент vector должен быть одномерным массивом, имеющим указатель заполнения, и new-element может быть любым объектом. vector-push пытается сохранить new-element в элемент вектора, на который ссылается указатель заполнения, и увеличить этот указатель на 1. Если указатель заполнения не определяет элемент вектора (например, когда он становится слишком большим), то vector-push возвращает nil. В противном случае, если вставка нового элемента произошла, vector-push возвращает предыдущее значение указателя. Таким образом, vector-push является индексом вставленного элемента.

Можно сравнить vector-push, которая является функцией, с push, который являет макросом, который принимает место подходящее для setf. Вектор с указателем заполнения содержит такое место в слоте fill-pointer. FIXME


[Функция] vector-push-extend new-element vector &optional extension

vector-push-extend похожа на vector-push за исключением того, что если указатель заполнения стал слишком большим, длина вектора увеличивается (с помощью adjust-array), и новый элемент помещается в вектор. Однако, если вектор не расширяемый, тогда vector-push-extend сигнализирует ошибку.

X3J13 voted in June 1989 to clarify that vector-push-extend regards an array as not adjustable if and only if adjustable-array-p is false of that array.

Необязательный аргумент extension, который должен быть положительным целым, является минимальным количеством элементов, добавляемых в вектор, если последний должен быть расширен. По-умолчанию содержит значение зависимое от реализации.


[Функция] vector-pop vector

Аргумент vector должен быть одномерным массивом, который имеет указатель заполнения. Если указатель заполнения является нулём, vector-pop сигнализирует ошибку. В противном случае, указатель заполнения уменьшается на 1, и в качестве значения функции возвращается обозначенный указателем элемент вектора.