Эти процедуры преобразуют строки, сравнивают знаки и читают отдельные байты. Примеры показывают, когда смена регистра меняет длину строки и какие знаки распознаются как цифры.
Преобразуйте строку и прочитайте байт
Запустите весь пример на площадке.
(list (string-upcase "Lispex") (char-numeric? #\7) (bytevector-u8-ref #u8(65) 0))Результат
("LISPEX" #t 65)Первый вызов переводит строку в верхний регистр. Второй проверяет, является ли знак #\7 цифрой. Третий читает первый байт из #u8(65). Позиции отсчитываются от 0.
Различайте преобразования строк и знаков
(list (string-upcase "Straße")
(char-upcase #\ß)
(char-ci=? #\A #\a)
(char-ci=? #\ς #\σ)
(string-ci=? "Straße" "STRASSE"))Результат
("STRASSE" #\ß #t #f #f)Преобразование регистра строки использует правила Unicode и может изменить её длину. Здесь string-upcase превращает ß в SS. Преобразование отдельного знака возвращает один знак, поэтому char-upcase оставляет #\ß без изменений.
Часть имени ci в char-ci=? и string-ci=? означает «без учёта регистра». Эти процедуры сравнивают значения после перевода в нижний регистр. Они считают буквы ASCII от A до Z равными буквам от a до z, поэтому третий результат — #t.
Некоторым знакам Unicode для совпадения недостаточно перевода в нижний регистр. Греческая конечная сигма ς и сигма σ здесь различаются, как и строки "Straße" и "STRASSE". Эти сравнения возвращают #f.
Процедуры char-foldcase и string-foldcase выполняют тот же перевод в нижний регистр, что и эти сравнения. Это приближение свёртывания регистра Unicode — преобразования для сравнения текста без учёта регистра.
Считайте знаки и распознавайте цифры
Знак, например #\A или #\한, представляет одно скалярное значение Unicode. Строка — последовательность таких знаков. Позиции в строке считают знаки, а не байты UTF-8.
| Вызов | Результат | Значение |
|---|---|---|
(string-ref "한A" 0) | #\한 | Первый знак |
(string-length "한A") | 2 | Два знака |
(char-numeric? #\7) | #f | Полноширинная цифра не относится к ASCII |
(char-alphabetic? #\한) | #t | Проверка принадлежности к буквам использует Unicode |
Процедура char-numeric? распознаёт только знаки от #\0 до #\9. Проверки букв, пробельных знаков, верхнего и нижнего регистра используют свойства Unicode. Знаки сравниваются в порядке скалярных значений Unicode.
Проверьте аргументы и результаты
Строки можно создавать, копировать, объединять, сравнивать и обрабатывать по знакам, а также преобразовывать в списки и векторы и обратно. Строки и байтовые векторы неизменяемы. Операции, создающие новую строку, сохраняют исходную.
| Вызов | Результат | Требования к аргументам |
|---|---|---|
(string-ref string k) | Один знак | k — точное целое от 0 до длины минус один; E312 при неверном типе, E311 вне диапазона |
(string-append string ...) | Новая строка | Все аргументы — строки |
(char-ci=? char char ...) | Булево значение | Не менее двух знаков; сравнение после описанного выше преобразования |
(string-map proc string) | Новая строка | Одна строка; вызовы proc слева направо; каждый вызов возвращает ровно один знак |
(bytevector-u8-ref bytes k) | Точное целое от 0 до 255 | k — точное целое от 0 до длины минус один; E312 при неверном типе, E311 вне диапазона |
Перед чтением байта можно узнать число байтов с помощью bytevector-length. Элементы байтового вектора принимают значения от 0 до 255.
Текущая версия позволяет читать строки и байтовые векторы. Процедуры изменения строк, изменения, копирования и объединения байтовых векторов, а также кодирования и декодирования UTF-8 недоступны.
Связанные страницы
Раздел Данные и составные типы знакомит с этими значениями. Остальные группы перечислены в указателе процедур.