Строки, подобно символам, числам, спискам и другим простым типам, являются основным типом данных, в работе с которыми используются свои элементарные примитивные функции и предикаты. Кроме того, строки наследуют весь набор методов своего родительского типа true.
Строку можно разделить на буквы (char). Буква также является типом данных. Его объекты в отличие от атомов, имя которых состоит из одного знака, изображаются в виде
#\x
В этой записи x является изображаемым данной записью буквой или словом в случае специальной буквы, обычно не имеющего печатного изображения. Например:
#\e | ; маленькое e |
#\T | ; большое t |
#\tab | ; табуляция |
Значением буквы, как и у констант, является сама буква:
>#\e
#\e
Является ли лисповский объект буквой, можно проверить предикатом (nil charp x).
В строке, буквы записываются друг за другом, для ограничения которой с обеих сторон в качестве ограничителя используется знак ", например:
"Это строка"
"(2 + 3)"
"\"" ; строка, состоящая из одного ограничителя
Если строку ввести в интерпретатор, то в качестве результата получим ту же строку. Строка не может представлять что-либо, кроме самой себя. Она является такой же константой, как числа и логические значения:
>"Это строка"
"Это строка"
>"(2 + 3)"
"(2 + 3)"
>(nil list "abc" "def")
("abc" "def") ; список строк
Функцией, проверяющей, имеет ли объект тип строки, является (nil stringp x), значением которой будет x, если x - это строка.
В работе со строками нужны функции по крайней мере для чтения элементов строки, изменения этих элементов и для сравнения двух строк.
Произвольный элемент строки можно прочитать функцией elt:
(строка elt n)
Приведём пример:
>("Кот" elt 0) ; индексация начинается с 0
#\К
Элемент строки можно изменить с помощью функции присваивания setelt, например:
>("Кот" setelt 0 #\Р)
"Рот"
Строки можно сравнивать с помощью предиката =:
(x = y)
Этот предикат проверяет идентичность двух строк.
>("Кот" = "кот")
false
>("Кот" = "Кот")
"Кот"