[Scheme ]

Строки и Буквы

Литерал для записи букв (я не использую здесь слово "символ" так как в Scheme термин "символ" используется в отношении другого типа данных) в Scheme выглядит следующим образом:

#\b -- буква "b"
#\м -- буква "м"

Некоторые непечатные буквы записываются по?другому, с использованием их названия на английском языке:

#\tab -- символ табуляции
#\space -- пробел
#\newline -- символ новой строки

Предикат "char?" служит для определения является ли объект буквой:

(char? #\t)

->#t

(char? 123)

->#f

Сравнение букв производится с помощью следующих функций:

char=? -- равны ли буквы
char<? -- меньше
char<=? -- меньше или равно
char>? -- больше
char>=? -- больше или равно

Все эти функции требуют хотя бы два аргумента:

(char=? #\я #\я #\я)

->#t

Для сравнения букв без учёта регистра используются следующие функции:

char-ci=?
char-ci<?
char-ci>?
char-ci<=?
char-ci>=?

(char-ci=? #\z #\Z)

->#t

Префикс "-ci" означает "case insensitive".


Строки представляют из себя последовательность букв.

Строковые литералы записываются в следующем виде:

"Это строка"

Для работы со строками используются следующие функции:

string? -- предикат определяющий является ли аргумент строкой

(string? "Гагарин")

->#t

(string? 777)

->#f

string-length -- возвращает длинну строки

(string-length "Привет МКС!")

->11

string-ref -- возвращает букву под указанным индексом, в Scheme нумерация букв в строке начинается с нуля.

(string-ref "Привет МКС!" 0)

->П

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

string=? -- сравнивает две и более строки и выводит #t если они равны

(string=? "Привет Мир!" "Привет Мкс!")

->#f

string<? -- меньше

string>? -- больше

string<=? -- меньше или равно

string>=? -- больше или равно

А эти функции применяются для сравнения строк без учёта регистра:

(string-ci=? string1 string2 string3 . . . )

(string-ci<? string1 string2 string3 . . . )

(string-ci>? string1 string2 string3 . . . )

(string-ci<=? string1 string2 string3 . . . )

(string-ci>=? string1 string2 string3 . . . )

(substring стр начало конец) -- выводит подстроку строки "стр" начиная с буквы под индексом "начало" (включительно), до буквы под индексом "конец" - 1 (то есть исключительно).

(substring "Поехали!" 0 2)

->По

К сожалению, аргумент "конец" является обязательным.

(let ((str "Поехали!")) (substring str 2 (string-length str)))

->ехали

Однако можно с лёгкостью создать свою процедуру требующую только один индекс:

(define substr (lambda (str start) (substring str start (string-length str))))
(substr "Гагарин -- герой" 11)

->герой

Функция "string-append" возвращает новую строку состоящую из всех представленных аргументов

(string-append "Гагарин" " -- " "герой" "!")

->Гагарин -- герой!

(string-copy string) -- копирует строку

(string-copy "давай")

->"давай"

(string-upcase string) -- выводит новую строку в верхрем регистре

(string-downcase string) -- выводит новую строку в регистре

(string-titlecase string) -- возвращает новую строку где все первые буквы в словах заглавные, а все остальные строчные

(string-upcase "ссср")

->СССР

(string-downcase "Бог")

->бог

(string-titlecase "союз советских социалистических республик")

->Союз Советских Социалистических Республик