Строки и Буквы
Литерал для записи букв (я не использую здесь слово "символ" так как в 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 "союз советских социалистических республик")
->Союз Советских Социалистических Республик