14.1 Простые функции для последовательностей

Большинство следующих функций выполняют простые операции над одиночными последовательностями. make-sequence создаёт новую последовательность.

[Функция] elt sequence index

Функция возвращает элемент последовательности sequence, указанный индексом index. Индекс должен быть неотрицательным целым числом меньшим чем длина последовательности sequence. Длина последовательности, в свою очередь, вычисляется функцией length. Первый элемент последовательности имеет индекс 0.

(Следует отметить, что elt учитывает указатель заполнения для векторов, его имеющих. Для доступа ко всем элементам таких векторов используется функция для массивов aref.)

Для изменения элемента последовательности может использоваться функция setf в связке с elt.


[Функция] subseq sequence start &optional end

Данная функция возвращает подпоследовательность последовательности sequence начиная с позиции start и заканчивая позицией end. subseq всегда создаёт новую последовательность для результата. Возвращённая подпоследовательность всегда имеет тот же тип, что и исходная последовательность.

Для изменения подпоследовательности элементов можно использовать setf в связке с subseq. Смотрите также replace.


[Функция] copy-seq sequence

Функция создаёт копию аргумента sequence. Результат равен equalp аргументу. Однако, результат не не равен eq аргументу.

(copy-seq x)  (subseq x 0)

но имя copy-seq лучше передаёт смысл операции.


[Функция] length sequence

Функция возвращает количество элементов последовательности sequence. Результат является неотрицательным целым числом. Если последовательность является вектором с указателем заполнения, возвращается «активная длина», то есть длина заданная указателем заполнения (смотрите раздел 17.5).


[Функция] reverse sequence

Результатом является новая последовательность такого же типа, что и последовательность sequence. Элементы итоговой последовательности размещаются в обратном порядке. Аргумент при этом не модифицируется.


[Функция] nreverse sequence

Результатом является последовательность, содержащая те же элементы, что и последовательность sequence, но в обратном порядке. Аргумент может быть уничтожен и использован для возврата результата. Результат может быть или не быть равен eq аргументу. Поэтому обычно используют явное присваивание (setq x (nreverse x)), так как просто (nreverse x) не гарантирует возврат преобразованной последовательности в x.

X3J13 voted in March 1989 to clarify the permissible side effects of certain operations. When the sequence is a list, nreverse is permitted to perform a setf on any part, car or cdr, of the top-level list structure of that list. When the sequence is an array, nreverse is permitted to re-order the elements of the given array in order to produce the resulting array.


[Функция] make-sequence type size &key :initial-element

Данная функция возвращает последовательность типа type и длинной size, каждый из элементов которой содержит значение аргумента :initial-element. Если указан аргумент :initial-element, он должен принадлежать типу элемента последовательности type. Например:

(make-sequence ’(vector double-float)
               100
               :initial-element 1d0)

Если аргумент :initial-element не указан, тогда последовательность инициализируется алгоритмом реализации.

X3J13 voted in January 1989 to clarify that the type argument must be a type specifier, and the size argument must be a non-negative integer less than the value of array-dimension-limit.

X3J13 voted in June 1989 to specify that make-sequence should signal an error if the sequence type specifies the number of elements and the size argument is different.

X3J13 voted in March 1989 to specify that if type is string, the result is the same as if make-string had been called with the same size and :initial-element arguments.