4.9 Преобразование регистра в Lisp

Функции преобразования регистра изменяют регистр отдельных символов или содержимого строк. Обычно функции преобразуют только буквенные символы (буквы от «A» до «Z» и от «a» до «z», а также не-ASCII буквы); другие символы не изменяются. Вы можете указать другую схему преобразования регистра, указав таблицу регистров (см. Таблица регистров).

Эти функции не изменяют переданные им строки в качестве аргументов.

Примеры ниже используют символы «X» и «x», которые имеют коды ASCII 88 и 120 соответственно.

Функция: downcase string-or-char

Эта функция преобразует string-or-char, который должен быть либо символом, либо строкой, в нижний регистр.

Когда string-or-char является строкой, эта функция возвращает новую строку, в которой каждая буква в аргументе, написанная заглавными буквами, преобразуется в строчные. Когда string-or-char является символом, эта функция возвращает соответствующий символ в нижнем регистре (целое число); если исходный символ уже в нижнем регистре или не является буквой, возвращаемое значение равно исходному символу.

(downcase "The cat in the hat")
     ⇒ "the cat in the hat"

(downcase ?X)
     ⇒ 120
Функция: upcase string-or-char

Эта функция преобразует string-or-char, который должен быть либо символом, либо строкой, в верхний регистр.

Когда string-or-char является строкой, эта функция возвращает новую строку, в которой каждая буква в аргументе, написанная строчными буквами, преобразуется в заглавные. Когда string-or-char является символом, эта функция возвращает соответствующий символ в верхнем регистре (целое число); если исходный символ уже в верхнем регистре или не является буквой, возвращаемое значение равно исходному символу.

(upcase "The cat in the hat")
     ⇒ "THE CAT IN THE HAT"

(upcase ?x)
     ⇒ 88
Функция: capitalize string-or-char

Эта функция приводит строки или символы к заглавному регистру. Если string-or-char является строкой, функция возвращает новую строку, содержимое которой является копией string-or-char, в которой каждое слово заглавлено. Это означает, что первый символ каждого слова преобразуется в верхний регистр, а остальные — в нижний.

Определение слова — это любая последовательность соседних символов, которым присваивается класс синтаксиса слова в текущей таблице синтаксиса (см. Таблица классов синтаксиса); если case-symbols-as-words не равен nil, символы, которым присвоен класс синтаксиса символа, также считаются частью слова.

Когда string-or-char является символом, эта функция делает то же самое, что и upcase.

(capitalize "The cat in the hat")
     ⇒ "The Cat In The Hat"

(capitalize "THE 77TH-HATTED CAT")
     ⇒ "The 77th-Hatted Cat"

(capitalize ?x)
     ⇒ 88
Функция: upcase-initials string-or-char

Если string-or-char является строкой, эта функция заглавливает начальные буквы слов в string-or-char, не изменяя никаких букв, кроме начальных. Она возвращает новую строку, содержимое которой является копией string-or-char, в которой первая буква каждого слова преобразована в верхний регистр.

Определение слова для этой функции такое же, как описано выше для capitalize, и case-symbols-as-words оказывает такое же влияние на символы слова.

Когда аргумент для upcase-initials является символом, upcase-initials дает тот же результат, что и upcase.

(upcase-initials "The CAT in the hAt")
     ⇒ "The CAT In The HAt"

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

(upcase "fi")  ; обратите внимание: одиночный символ, лигатура "fi"
     ⇒ "FI"
(upcase ?fi)
     ⇒ 64257  ; т.е. ?fi

Чтобы этого избежать, символ сначала должен быть преобразован в строку с помощью функции string, прежде чем передавать его одной из функций преобразования регистра. Разумеется, никаких предположений о длине результата делать нельзя.

Другие символы также могут иметь специальные правила преобразования регистра. Все они имеют не-nil свойства символа special-uppercase, special-lowercase или special-titlecase (см. Свойства символов), определенные Стандартом Unicode. Эти свойства определяют специальные правила преобразования регистра, которые переопределяют текущую таблицу регистров (см. Таблица регистров).

См. Сравнение символов и строк для функций, сравнивающих строки; некоторые из них игнорируют различия в регистре, а другие могут опционально игнорировать различия в регистре.