3.11. STRING: РАБОТА СО СТРОКАМИ

$func STRING e.Source = s.String;

$func STRING-INIT s.String s.Len s.Fill = ;

$func STRING-FILL s.String s.Fill = ;

$func STRING-LENGTH s.String = s.Len;

$func STRING-REF s.String s.Index = s.Char;

$func STRING-SET s.String s.Index s.Char = ;

$func STRING-REPLACE s.String e.Source = ;

$func SUBSTRING s.String s.Index s.Len = s.NewString;

$func SUBSTRING-FILL s.String s.Index s.Len s.Fill = ;


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

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

В каждый момент времени строка содержит конечную (может быть пустую) последовательность символов-литер, которую мы будем называть содержимым строки. Если строка содержит последовательность из N+1 символов-литер Oc0, Oc1, ..., OcN, мы будем говорить, что строка имеет длину N+1, а содержимое строки будем изображать в виде

Oc0 Oc1 ... OcN

Таким образом, компоненты строки Oc0, Oc2, ..., OcN нумеруются, начиная с нуля.


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

Пусть значение параметра e.Source имеет вид: Os1 Os2 ... OsM, где каждый из символов Osj является либо символом-литерой, либо символом-словом, либо ссылкой на строку. Тогда каждый из Osj преобразуется следующим образом.

Если Osj является символом-литерой Oc, он остается без изменения.

Если Osj является символом-словом, он заменяется на цепочку литер, которая является печатным именем этого символа.

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

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


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


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


STRING-LENGTH выдает длину строки, на которую указывает s.String.


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


STRING-SET изменяет содержимое строки, на которую указывает s.String. При этом длина строки не меняется, а компонента строки с номером s.Index принимает значение s.Char.


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


SUBSTRING создает новую строку и выдает ссылку на нее в качестве результата. При этом содержимое создаваемой строки формируется следующим образом. Рассматривается содержимое исходной строки, т.е. строки, на которую указывает s.String. Пусть оно имеет вид Oc0 Oc1 ... OcN. Тогда от него отбрасываются первые s.Index символов, а первые s.Len из оставшихся символов считаются содержимым новой строки.

В любом случае, в результате работы функции SUBSTRING состояние исходной строки не изменяется.


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


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

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