3.13. VECTOR: РАБОТА С ВЕКТОРАМИ

$func VECTOR e.Source = s.Vector;

$func VECTOR-TO-EXP s.Vector = e.Exp;

$func VECTOR-INIT s.Vector s.Len e.Fill = ;

$func VECTOR-FILL s.Vector e.Fill = ;

$func VECTOR-LENGTH s.Vector = s.Len;

$func VECTOR-REF s.Vector s.Index = e.Exp;

$func VECTOR-SET s.Vector s.Index e.Exp = ;

$func VECTOR-REPLACE s.Vector e.Source = ;

$func SUBVECTOR s.Vector s.Index s.Len = s.NewVector;

$func SUBVECTOR-FILL s.Vector s.Index s.Len e.Fill = ;


Эти функции используются для создания векторов, изменения их содержимого и доступа к их содержимому. Их аргументы должны удовлетворять следующим требованиям. s.Vector должен быть ссылкой на вектор. s.Index и s.Len должны быть неотрицательными целыми числами. e.Fill может быть произвольным объектным выражением. e.Source должен быть последовательностью ссылок на векторы и термов вида (Oe).

Если хотя бы одно из этих условий не выполнено, результатом функций является $error(Fname "Invalid argument"), где Fname - имя функции.

В каждый момент времени вектор содержит конечную (может быть пустую) последовательность объектных выражений, которую мы будем называть содержимым вектора. Если вектор содержит последовательность из N+1 объектных выражений Oe0, Oe1, ..., OeN, мы будем говорить, что вектор имеет длину N+1, а содержимое вектора будем изображать в виде

(Oe0)(Oe1) ... (OeN)

Таким образом, компоненты вектора Oe0, Oe2, ..., OeN нумеруются, начиная с нуля.


VECTOR создает новый вектор и выдает ссылку на него в качестве результата. При этом содержимое создаваемого вектора формируется из e.Source следующим образом.

Пусть значение параметра e.Source имеет следующий вид: Ot1 Ot2 ... OtM, где каждый из объектных термов Otj либо имеет вид (Oe), либо является ссылкой на вектор. Тогда каждый из Otj преобразуется следующим образом.

Если Otj имеет вид (Oe), он остается без изменения.

Если Otj является ссылкой на какой-то вектор, он заменяется на содержимое этого вектора (при этом состояние самого вектора не изменяется).

Преобразованное таким образом значение параметра e.Source становится содержимым нового вектора.


VECTOR-TO-EXP выдает в виде объектного выражения содержимое вектора, на который указывает s.Vector.


VECTOR-INIT изменяет содержимое вектора, на который указывает s.Vector. Старое содержимое уничтожается и вместо него создается новое содержимое длины s.Len, причем каждая компонента вектора принимает значение e.Fill.


VECTOR-FILL изменяет содержимое вектора, на который указывает s.Vector. При этом длина вектора не меняется, а каждая компонента вектора принимает значение e.Fill.


VECTOR-LENGTH выдает длину вектора, на который указывает s.Vector.


VECTOR-REF извлекает из вектора, на который указывает s.Vector, содержимое его компоненты с номером s.Index, которое и выдается в качестве результата.


VECTOR-SET изменяет содержимое вектора, на который указывает s.Vector. При этом длина вектора не меняется, а компонента вектора с номером s.Index принимает значение e.Exp.


VECTOR-REPLACE изменяет содержимое вектора, на который указывает s.Vector. Старое содержимое уничтожается, а новое содержимое формируется из значения параметра e.Source точно таким же способом, как и в случае функции VECTOR.


SUBVECTOR создает новый вектор и выдает ссылку на него в качестве результата. При этом содержимое создаваемого вектора формируется следующим образом. Рассматривается содержимое исходного вектора, т.е. вектора, на который указывает s.Vector. Пусть оно имеет вид (Oe0)(Oe1) ... (OeN). Тогда от него отбрасываются первые s.Index термов, а первые s.Len из оставшихся термов считаются содержимым нового вектора.

Состояние исходного вектора при этом не меняется.


SUBVECTOR-FILL изменяет содержимое вектора, на который указывает s.Vector. При этом длина вектора не меняется, а s.Len последовательно расположенных компонент вектора, начиная с компоненты с номером s.Index, принимают значение e.Exp.


Если размер исходного вектора недостаточен для выполнения одной из вышеуказанных операций, в качестве результата выдается $error(Fname "Index out of range"), где Fname - имя функции, а состояние вектора не меняется.

Если при выполнении одной из вышеуказанных операций возникает необходимость создать содержимое вектора, длина которого больше, чем допускается реализацией, в качестве результата выдается $error(Fname "Size limit exceeded"), где Fname - имя функции, а состояние вектора не меняется.