Описание строковых функций HomeLisp

Строки являются важнейшим типом данных. Без использования строк, например, пректически невозможно организовать взвимодействие программы с пользователем. Строка в HomeLisp-е является специфическим атомом, первым и последним сиволом имени которого являются двойные кавычки.

Важнейшим отличием строк от атомов является то обстоятельство, что в строках заглавные и строчные буквы различаются. Так, ABC и abc - это один и тот же атом, а строки "ABC" и "abc" - различные атомы.

Имеется особенность при записи строк, содержащих в имени двойную кавычку: двойные кавычки внутри строки при записи должны удваиваться. Так, запись "Проверка "связи"" - неверная запись строки. Правильная запись этой строки имеет вид: "Проверка ""связи""". Двойные кавычки удваиваются только при записи; внутри строки каждая удвоенная кавычка хранится как один символ. В этом легко убедиться, вычислив длину строки "Проверка ""связи""" с помощью встроенной функции STRLEN; будет получен результат 16, а не 18, как могло бы показаться.

Обработка строк предполагает в качестве операций разрезание строк на отдельные части, замену отдельных символов на другие и т.д. Все эти действия можно назвать алхимией: атом может быть "разделен" на две или более частей! Следует, правда, отметить, что при "разделении" атома на части, исходный атом никуда не девается.

Все строковые функции являются функциями типа SUBR (их аргументы вычисляются).

Имена строковых функций в HomeLisp для удобства начинаются префиксом STR. Строковые функции доступны во всех режимах работы HomeLisp. Две функции (STRISFIX и STRISFLO) реализованы только в 13-й редакции ядра.

Имя функции К-во аргументов Тип аргументов Выполняемое действие
STRASC   1 STRING Дать ASCII-код первого символа строки
STRATRIM   1 STRING Удалить лидирующие и хвостовые пробелы
STRCAT   Переменное STRING Склейка строк
STRCHR   1 FIXED Дать односимвольную строку по коду ASCII аргумента
STRDEL   3 STRING, FIXED, FIXED Удалить в строке подстроку
STRIND   2 STRING Дать позицию (индекс) подстроки
STRINJ   3 STRING, FIXED, STRING Вставить подстроку в строку
STRISFIX   (13)   1 STRING Является ли строка представлением числа типа FIXED
STRISFLO   (13)   1 STRING Является ли строка представлением числа типа FLOAT
STRLCASE   1 STRING Перевести строку в нижний регистр
STRLEN   1 STRING Дать длину строки
STRLTRIM   1 STRING Удалить лидирующие пробелы
STRMID   2 или 3 STRING, FIXED, [FIXED] Дать подстроку с заданной позиции и заданной длины (или до конца строки)
STRPRESS   1 STRING Удалить из строки все пробелы (сжать)
STRREP   3 STRING Заменить в строке все вхождения заданной подстроки
STRRTRIM   1 STRING Удалить хвостовые пробелы
STRSPACE   1 FIXED Дать строку из заданного к-ва пробелов
STRSTRING   2 FIXED Дать строку из заданного к-ва символов с заданным ASCII-кодом
STRUCASE   1 STRING Перевести строку в верхний регистр
STRUPD   3 STRING, FIXED, STRING Заменить подстроку с заданного символа
STRASC  

Функция STRASC принимает один аргумент типа STRING и возвращает результат типа FIXED, равный значению ASCII-кода первого символа строки-параметра. Если на вход функции подается пустая строка (нулевой длины), то возбуждается состояние ошибки.

Вот примеры вызова функции STRASC:


(strAsc "123")

==> 49

(strAsc "Bob")

==> 66

(strAsc "")

STRASC: аргумент - пустая строка
==> ERRSTATE

(strAsc """45")

==> 34
STRATRIM  

Функция STRATRIM принимает один аргумент типа STRING и возвращает новую строку, из которой удалены лидирующие и хвостовые пробелы. Пробелы, стоящие внутри строки, не удаляются. Если входная строка не имеет лидирующих и хвостовых пробелов, то функцию возвращает значение аргумента.

Вот примеры вызова функции STRATRIM:


(stratrim "   Проба пера   ")

==> "Проба пера"

(stratrim "Проба пера")

==> "Проба пера"
STRCAT  

Функция STRCAT принимает произвольное количество аргументов типа STRING и возвращает новую строку, равную конкатенации (склейке) значений своих аргументов. Если задан только один аргумент, то функция вернет значение этого аргумента. Если среди аргуметов встретится аргумент, не имеющий типа STRING, то возбуждается состояние ошибки.

Вот примеры вызова функции STRCAT:


(strCat "QQQ" "WWW" "EEE")

==> "QQQWWWEEE"

(strCat "QQQ")

==> "QQQ"

(strCat "10!=" (fact 10))

STRCAT: один из аргументов - не cтрока
==> ERRSTATE

(strCat "10!=" (fix2str (fact 10)))

==> "10!=3628800"

(strCat "QQQ" "")

==> "QQQ"

В первом примере выполняется склейка трех строк. Во втором примере на вход функции подан единственный аргумент. Результат функции - его значение. В третьем примере одним из аргументов является число типа FIXED; возникает ошибка. А если преобразовать значение типа FIXED в строку, то ошибки не возникает. Последний пример показывает пример склейки с пустой строкой.

STRCHR  

Функция STRCHR принимает один аргумент типа FIXED, значение которого должно быть в диапазоне [0,255]. Функция возвращает односимвольную строку с символом, код ASCII, которого равен значению аргумента. Если значение аргумента находится за пределами допустимого диапазона, то возбуждается состояние ошибки.

Вот примеры вызова функции STRCHR:


(strChr 65)

==> "A"

(strChr 98)

==> "b"

(strChr 234)

==> "к"

(strChr -19)

STRCHR: значение параметра вне диапазона [0,255]
==> ERRSTATE
STRDEL  

Функция STRDEL принимает три обязательных аргумента: первый - типа STRING, два последующих - типа FIXED. Функция возвращает результат удаления из строки, заданной первым аргументом, последовательности символов длиной, заданной третьим аргументом, с позиции, заданной вторым аргументом.

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

Вот примеры вызова функции STRDEL:


(strDel "Проба" 2 3)

==> "Па"

(strDel "Проба" 12 3)

STRDEL: начальная позиция за пределами строки
==> ERRSTATE

(strDel "Проба" -12 3)

STRDEL: один из числовых аргументов неположителен
==> ERRSTATE

(strDel "Проба" 2 30)

==> "П"

(strDel "Проба" 1 30)

==> ""
STRIND  

Функция STRIND принимает два обязательных аргумента STRING. Функция возвращает номер позиции, начиная с которой строка, заданная вторым аргументом входит в строку, заданную первым аргументом. Если строка, заданная вторым аргументом НЕ входит в строку, заданную первым аргументом, то функция возвращает нуль. Вот примеры вызова функции STRIND:


(strInd "HomeLisp" "Lisp")

==> 5

(strInd "HomeLisp" "lisp")

==> 0
STRINJ  

Функция STRINJ принимает три обязательных аргумента: первый - типа STRING, второй - типа FIXED, и третий - типа STRING. Функция возвращает строку, полученную из значения первого аргумента, путем вставки с позиции, заданной значением второго аргумента строки-значения третьего аргумента. При этом символы исходной строки, стоящие правее позиции вставки, сдвигаются вправо (в отличие от действия описанной ниже функции STRUPD, которая не раздвигает исходную строку, а заменяет символы правее позиции вставки новыми).

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

Вот примеры вызова функции STRINJ:


(strInj "Па" 2 "роб")

==> "Проба"

(strInj "Па" 1 "роб")

==> "робПа"

(strInj "Па" 3 "роб")

==> "Пароб"

(strInj "Па" 4 "роб")

STRINJ: начальная позиция за пределами строки
==> ERRSTATE

Следует обратить внимание на то, что если значение второго аргумента равно единице, то действие функции эквивалентно действию STRCAT с третьим и первым аргументами. Аналогично, если значение второго аргумента равно длине строки-первого аргумента, увеличенной на единицу, то действие функции эквивалентно действию STRCAT с третьим и первым аргументами.

STRISFIX  

Функция STRISFIX (реализованная только в 13-й редакции ядра) принимает один аргумент типа STRING. Функция возвращает логическое значение (T или Nil) в зависимости от того, является ли значение аргумента корректным представлением числа типа FIXED.

Вот примеры вызова функции STRISFIX:


(strIsFix "90")

==> T

(strIsFix "9.0")

==> NIL

(strIsFix "9,0")

==> NIL

(strIsFix &H77)

STRISFIX: параметр - не строка
==> ERRSTATE

(strIsFix 78)

STRISFIX: параметр - не строка
==> ERRSTATE

Видно, что функция strIsFix контролирует тип своего аргумента (должен быть строкой) и ведет себя вполне предсказуемо.

STRISFLO  

Функция STRISFLO (реализованная только в 13-й редакции ядра) принимает один аргумент типа STRING. Функция возвращает логическое значение (T или Nil) в зависимости от того, является ли значение аргумента корректным представлением числа типа FLOAT.

Вот примеры вызова функции STRISFLO:


(strIsFlo 7.9)

strIsFlo: параметр - не строка
==> ERRSTATE

(strIsFlo "7,9")

==> NIL

(strIsFlo "7.9")

==> T

(strIsFlo "7.9E2")

==> T

(strIsFlo "7.9D2")

==> T

(strIsFlo "792")

==> T

(strIsFlo (fix2str (fact 100)))

==> T

(strIsFlo (fix2str (fact 300)))

==> NIL

Видно, что функция strIsFix контролирует тип своего аргумента (должен быть строкой) и ведет себя вполне предсказуемо. Пусть читатель обратит внимание на два момента:

Символом порядка в числе с плавающей точкой могут быть буквы E или D;

Для чисел с фиксированной точкой, попадающих в диапазон [-10300,10300] функция STRISFLO возвращает T, а для целых, выходящих за пределы указанного диапазона - Nil.

Последнее хорошо видно на последней врезке: поскольку 100!~10157, то функция возвращает T, тогда как 300! лежит за пределами допустимого диапазона и функция возвращаете Nil.

STRLCASE  

Функция STRLCASE принимает один обязательный аргумент типа STRING. Функция возвращает строку, полученную из значения первого аргумента, путем перевода всех букв в нижний регистр (преобразование в строчные буквы). Символы строки-аргумента, не являющиеся буквами, при этом не меняются. Парная функция STRUCASE переводит строку в верхний регистр.

Вот примеры вызова функции STRLCASE:


(strLcase "HomeLisp")

==> "homelisp"

(strLcase "123")

==> "123"
STRLEN  

Функция STRLEN принимает один обязательный аргумент типа STRING. Функция возвращает длину строки, заданной значением аргумента. Если аргумент представляет собой пустую строку, функция возвращает нуль.

Вот примеры вызова функции STRLEN:


(strLen "HomeLisp")

==> 8

(strLen (fix2str (fact 100)))

==> 158

(strLen "")

==> 0
STRLTRIM  

Функция STRLTRIM принимает один аргумент типа STRING и возвращает новую строку, из которой удалены только лидирующие пробелы. Пробелы, стоящие внутри строки (а также хвостовые пробелы), не удаляются. Если входная строка не имеет лидирующих пробелов, то функцию возвращает значение аргумента.

Вот примеры вызова функции STRLTRIM:


(strltrim "   Проба пера   ")

==> "Проба пера   "

(strltrim "Проба пера")

==> "Проба пера"
STRMID  

Функция STRMID принимает два или три аргумента. Первый из них должен иметь тип STRING; один или два последующих - FIXED. Функция возвращает подстроку, строки, заданной первым аргументом, с позиции, заданной вторым аргументом и длиной, равной значению третьего аргумента. Если третий аргумент опущен - возвращается построка с заданной позиции до конца строки. Если значение второго аргумента больше длины строки, то функция возвращает пустую строку. Значения второго и третьего аргументов (если последний задан) должны быть положительными, в противном случае возбуждается состояние ошибки.

Вот примеры вызова функции STRMID:


_ver

==> "HomeLisp Вер. 1.11.1 (Файфель Б.Л.)"

(strLen _ver)

==> 35

(strMid _ver 40 5)

==> ""

(strMid _ver 5 4)

==> "Lisp"

(strMid _ver 5)

==> "Lisp Вер. 1.11.1 (Файфель Б.Л.)"

(strMid _ver 1 4)

==> "Home"

(strMid _ver 1 -4)

STRMID: второй и/или третий параметр неположителен
==> ERRSTATE

(strMid _ver -1 4)

STRMID: второй и/или третий параметр неположителен
==> ERRSTATE

Здесь используется предопределенный атом _ver, содержащий сведения о версии программы. Этот атом имеет значением строку, которая приведена на врезке. Попытка получить подстроку с позиции за пределами строки возвращает строку нулевой длины.

STRPRESS  

Функция STRPRESS принимает один аргумент типа STRING и возвращает новую строку, из которой удалены все пробелы (лидирующие, стоящие внутри строки и хвостовые). Если входная строка не содержит пробелов, то функцию возвращает значение аргумента.

Вот примеры вызова функции STRPRESS:


(strPress "   Проба пера   ")

==> "Пробапера"

(strPress "Проба пера")

==> "Пробапера"

В отличие от функций STRLTRIM, STRRTRIM и STRATRIM, функция STRPRESS удаляет из строки абсолютно все пробелы.

STRREP  

Функция STRREP принимает три обязательных аргумента типа STRING. Функция возвращает строку, полученную из значения первого аргумента, в которой каждое вхождение строки, заданной вторым аргументом, заменяется значением третьего аргумента.

Другими словами, STRREP осуществляет замену по схеме:

(strRep Где_заменять Что_заменять На_что_заменять)


Вот примеры вызова функции STRREP:


(strRep "Вышел котик на тропинку" "котик" "песик")

==> "Вышел песик на тропинку"

(strRep "котик котик Котик" "котик" "песик")

==> "песик песик Котик"

В последнем вызове не произошло замены строки "Котик" на строку "песик", поскольку строки "Котик" и "котик" не совпадают.

STRRTRIM  

Функция STRRTRIM принимает один аргумент типа STRING и возвращает новую строку, из которой удалены только хвостовые пробелы. Пробелы, стоящие внутри строки (а также лидирующие пробелы), не удаляются. Если входная строка не имеет хвостовых пробелов, то функцию возвращает значение аргумента.

Вот примеры вызова функции STRRTRIM:


(strrtrim "   Проба пера   ")

==> "   Проба пера"

(strrtrim "Проба пера")

==> "Проба пера"
STRSPACE  

Функция STRSPACE принимает один аргумент типа FIXED и возвращает строку, состоящую из пробелов, c длиной, равной значению аргумента. Значение аргумента не может быть отрицательным (возбуждается состояние ошибки) и не должно превышать 1000. Если значение аргумента равно нулю, функция вернет пустую строку.

Вот примеры вызова функции STRSPACE:


(strspace 5)

==> "     "

(strspace 0)

==> ""

(strspace -1)

strSpace: значение параметра вне диапазона [0,1000]
==> ERRSTATE
STRSTRING  

Функция STRSTRING принимает два аргумента типа FIXED и возвращает строку, состоящую из символов с кодом ASCII, равным значению второго аргумента, длиной, равной значению первого аргумента. Значение первого аргумента должно лежать в диапазоне [0-1000]; при этом, если значение равно нулю, то функция вернет строку нулевой длины. Значение второго аргумента должно лежать в диапазоне [0-255]. Если значение хотя бы одного из аргументов лежит вне допустимого диапазона, фиксируется ошибка.

Вот примеры вызова функции STRSTRING:


(strstring 0 45)

==> ""

(strstring 0 -45)

strString: значение второго параметра вне диапазона [0,255]
==> ERRSTATE

(strstring -4 45)

strString: значение первого параметра вне диапазона [1,1000]
==> ERRSTATE

(strstring 10 45)

==> "----------"
STRUCASE  

Функция STRUCASE принимает один обязательный аргумент типа STRING. Функция возвращает строку, полученную из значения первого аргумента, путем перевода всех букв в верхний регистр (преобразование в заглавные буквы). Символы строки-аргумента, не являющиеся буквами, при этом не меняются. Парная функция STRLCASE переводит строку в нижний регистр.

Вот примеры вызова функции STRUCASE:


(strUcase "HomeLisp")

==> "HOMELISP"

(strLcase "123")

==> "123"
STRUPD  

Функция STRUPD принимает три обязательных аргумента: первый типа STRING, второй - типа FIXED и третий типа STRING. Функция возвращает строку, заданную первым аргументом, у которой символы, начиная с позиции, заданной значением второго аргумента, заменены символами из третьего аргумента. Функция не выполняет раздвижки исходной строки, как это делает функция STRINJ.

При этом, если заменяющая строка имеет слишком большую длину (выводящую за пределы исходной строки), то замене подвергнутся только символы до конца исходной строки. Другими словами, функция STRUPD всегда возвращает результат той же длины, что и исходная строка (заданная первым аргументом). Если строка, заданная третьим аргументом, имеет нулевую длину, то функция вернет исходную строку без замены.

Позиция начала замены (значение второго аргумента) не должно выводить за пределы строки, в противном случае возникает ошибка.

Вот примеры вызова функции STRUPD:


(strUpd "QQQQQQWWWWWW" 5 "------")

==> "QQQQ------WW"

(strUpd "QQQQQQWWWWWW" 55 "------")

STRUPD: позиция замены за пределами строки
==> ERRSTATE

(strUpd "QQQQQQWWWWWW" 5 "")

==> "QQQQQQWWWWWW"

(strUpd "QQQQQQWWWWWW" 5 "----------------------")

==> "QQQQ--------"