18.2 Сравнение строк

Правило именования этих функций и их аргументов следует из правил именования общих функций для последовательностей (смотрите главу 14).

[Функция] string= string1 string2 &key :start1 :end1 :start2 :end2

string= сравнивает две строки и возвращает истину, если они одинаковые (все символы одинаковые), и ложь, если это не так. Функция equal вызывает string=, если применяется к двум строкам.

Именованные аргументы :start1 и :start2 указывают на то, с каких позиций начинать сравнение. Именованные аргументы :end1 и :end2 указывают на то, на каких позициях заканчивать сравнение. Сравнение заканчивается перед указанными позициями. Аргументы «start» по-умолчанию равны нулю (указывают на начало строки), и «end» (если опущены или равны nil) по-умолчанию указывают на конец строки. Таким образом, по-умолчанию строки сравниваются целиком. Эти аргументы позволяют удобно сравнивать подстроки. string= возвращает ложь, если сравниваемые (под)строки неодинаковой длины. То есть, если

(not (= (- end1 start1) (- end2 start2)))

истинно, то string= ложно.

(string= "foo" "foo") истина
(string= "foo" "Foo") ложь
(string= "foo" "bar") ложь
(string= "together" "frog" :start1 1 :end1 3 :start2 2)
   истина

X3J13 voted in June 1989 to clarify string coercion (see string).


[Функция] string-equal string1 string2 &key :start1 :end1 :start2 :end2

string-equal похож на string= за исключением того, что игнорирует регистр символов. Два символа равны если char-equal для них истинно. Например:

(string-equal "foo" "Foo") is true

X3J13 voted in June 1989 to clarify string coercion (see string).


[Функция] string< string1 string2 &key :start1 :end1 :start2 :end2
[Функция] string> string1 string2 &key :start1 :end1 :start2 :end2
[Функция] string<= string1 string2 &key :start1 :end1 :start2 :end2
[Функция] string>= string1 string2 &key :start1 :end1 :start2 :end2
[Функция] string/= string1 string2 &key :start1 :end1 :start2 :end2

Эти функции сравнивают две строки лексикографически. Если не выполняется условие, что string1 соответственно меньше, больше, меньше либо равно, больше либо равно, не равно чем string2, то результат nil. Однако, если условие выполняется, то результатом будет первая позиция символа, на которой произошло несовпадение строк. Другими словами, результат это длина префикса строки, удовлетворяющего условию.

Строка a меньше, чем строка b, если в первой позиции, в которой они различаются, символ из a меньше, чем соответствующий символ из b в соответствие с функцией char<, или строка a является префиксом строки b (меньшей длины и совпадением всех символов). FIXME

Именованные аргументы :start1 и :start2 указывают на то, с каких позиций начинать сравнение. Именованные аргументы :end1 и :end2 указывают на то, на каких позициях заканчивать сравнение. Сравнение заканчивается перед указанными позициями. Аргументы «start» по-умолчанию равны нулю (указывают на начало строки), и «end» (если опущены или равны nil) по-умолчанию указывают на конец строки. Таким образом, по-умолчанию строки сравниваются целиком. Эти аргументы позволяют удобно сравнивать подстроки. Индекс, возвращаемый в случае несовпадения строк, находится в string1. FIXME

X3J13 voted in June 1989 to clarify string coercion (see string).


[Функция] string-lessp string1 string2 &key :start1 :end1 :start2 :end2
[Функция] string-greaterp string1 string2 &key :start1 :end1 :start2 :end2
[Функция] string-not-greaterp string1 string2 &key :start1 :end1 :start2 :end2
[Функция] string-not-lessp string1 string2 &key :start1 :end1 :start2 :end2
[Функция] string-not-equal string1 string2 &key :start1 :end1 :start2 :end2

Эти функции такие же, как и соответственно string<, string>, string<=, string>= и string/= за исключением того, что различия между регистрами букв игнорируются. Для сравнения символов в таком случае вместо char< используется char-lessp.

X3J13 voted in June 1989 to clarify string coercion (see string).