Песочница

Процедуры строк, знаков и байтовых векторов

Меняйте регистр, сравнивайте знаки, читайте позиции в строках и байты со значениями от 0 до 255.

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

Преобразуйте строку и прочитайте байт

Запустите весь пример на площадке.

LISPEX
(list (string-upcase "Lispex") (char-numeric? #\7) (bytevector-u8-ref #u8(65) 0))

Результат

ВЫВОД
("LISPEX" #t 65)

Первый вызов переводит строку в верхний регистр. Второй проверяет, является ли знак #\7 цифрой. Третий читает первый байт из #u8(65). Позиции отсчитываются от 0.

Различайте преобразования строк и знаков

LISPEX
(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 до 255k — точное целое от 0 до длины минус один; E312 при неверном типе, E311 вне диапазона

Перед чтением байта можно узнать число байтов с помощью bytevector-length. Элементы байтового вектора принимают значения от 0 до 255.

Текущая версия позволяет читать строки и байтовые векторы. Процедуры изменения строк, изменения, копирования и объединения байтовых векторов, а также кодирования и декодирования UTF-8 недоступны.

Связанные страницы

Раздел Данные и составные типы знакомит с этими значениями. Остальные группы перечислены в указателе процедур.