Racket: Оперирование строками
Получение отдельных символов и подстрок
Получить элемент строки, зная его индекс, можно с помощью функции string-ref. Если указанный индекс выйдет за границы строки, то вычисление завершится с ошибкой.
(string-ref "apple" 3) ; #\l
(string-ref "apple" 5)
; string-ref: index is out of range
; index: 5
; valid range: [0, 4]
; string: "apple"
; context...Взятие же подстроки выглядит так:
; индексы: 01234
(substring "Apple" 2) ; "ple"
(substring "Apple" 1 3) ; "pp"
(substring "Apple" 10 20)
; substring: starting index is out of range
; starting index: 10
; valid range: [0, 5]
; string: "Apple"
; context...Заметьте, что (substring s n) выделяет подстроку от символа с индексом n и до конца исходной строки s. А вот (substring s n m) выделяет подстроку от индекса n до индекса m, не включая последний! Такое исключение правой границы встречается довольно часто в программировании. И, как и в случае string-ref, Racket следит, чтобы индексы не вышли за границы.
Конкатенация строк
Соединить несколько строк в одну или, как ещё говорят, сконкатенировать, можно с помощью функции string-append:
(string-append "Hello, " "World!") ; "Hello, World!"
(string-append "foo") ; "foo"
(string-append "b" "a" "r") ; "bar"Модуль racket/string
В поставку Racket входит модуль racket/string, предоставляющий большое количество полезных, но более специфических, чем простая конкатенация, функций.
Обычно этот модуль подключать не приходится, потому что
#lang racketделает это автоматически.
Например, функция string-join из этого модуля может просто сконкатенировать все строки из заданного списка, добавив между строками строку-разделитель, а ещё способна добавить что-нибудь в начало получаемого текста, в его конец и даже перед последним присоединяемым элементом! На это стоит посмотреть:
(string-join (list "a" "b" "c")) ; "a b c" - разделитель, это пробел
(define (greet names)
(string-join
names ", "
#:before-first "Hello, "
#:before-last " and "
#:after-last "!"))
(greet (list "Bob")) ; "Hello, Bob!"
(greet (list "Bob" "Tom")) ; "Hello, Bob and Tom!"
(greet (list "Bob" "Tom" "Alice")) ; "Hello, Bob, Tom and Alice!"Узнать больше об этой функции и познакомиться с другими функциями модуля вы сможете в документации.
Задание
Реализуйте функцию scroll-left, которая "прокручивает" строку-аргумент влево так, что в строке-результате все символы, начиная со второго, оказываются сдвинуты на одну позицию влево, а первый символ оказывается в конце строки. В пустой строке прокручивать нечего, поэтому пустая строка должна оставаться неизменной.
Примеры:
(scroll-left "") ; ""
(scroll-left "a") ;"a"
(scroll-left "abc") ; "bca"
(scroll-left "*----") ; "----*"
(scroll-left (scroll-left "*----")) ; "---*-"Racket: Оперирование строками
Получение отдельных символов и подстрок
Получить элемент строки, зная его индекс, можно с помощью функции string-ref. Если указанный индекс выйдет за границы строки, то вычисление завершится с ошибкой.
(string-ref "apple" 3) ; #\l
(string-ref "apple" 5)
; string-ref: index is out of range
; index: 5
; valid range: [0, 4]
; string: "apple"
; context...Взятие же подстроки выглядит так:
; индексы: 01234
(substring "Apple" 2) ; "ple"
(substring "Apple" 1 3) ; "pp"
(substring "Apple" 10 20)
; substring: starting index is out of range
; starting index: 10
; valid range: [0, 5]
; string: "Apple"
; context...Заметьте, что (substring s n) выделяет подстроку от символа с индексом n и до конца исходной строки s. А вот (substring s n m) выделяет подстроку от индекса n до индекса m, не включая последний! Такое исключение правой границы встречается довольно часто в программировании. И, как и в случае string-ref, Racket следит, чтобы индексы не вышли за границы.
Конкатенация строк
Соединить несколько строк в одну или, как ещё говорят, сконкатенировать, можно с помощью функции string-append:
(string-append "Hello, " "World!") ; "Hello, World!"
(string-append "foo") ; "foo"
(string-append "b" "a" "r") ; "bar"Модуль racket/string
В поставку Racket входит модуль racket/string, предоставляющий большое количество полезных, но более специфических, чем простая конкатенация, функций.
Обычно этот модуль подключать не приходится, потому что
#lang racketделает это автоматически.
Например, функция string-join из этого модуля может просто сконкатенировать все строки из заданного списка, добавив между строками строку-разделитель, а ещё способна добавить что-нибудь в начало получаемого текста, в его конец и даже перед последним присоединяемым элементом! На это стоит посмотреть:
(string-join (list "a" "b" "c")) ; "a b c" - разделитель, это пробел
(define (greet names)
(string-join
names ", "
#:before-first "Hello, "
#:before-last " and "
#:after-last "!"))
(greet (list "Bob")) ; "Hello, Bob!"
(greet (list "Bob" "Tom")) ; "Hello, Bob and Tom!"
(greet (list "Bob" "Tom" "Alice")) ; "Hello, Bob, Tom and Alice!"Узнать больше об этой функции и познакомиться с другими функциями модуля вы сможете в документации.
Задание
Реализуйте функцию scroll-left, которая "прокручивает" строку-аргумент влево так, что в строке-результате все символы, начиная со второго, оказываются сдвинуты на одну позицию влево, а первый символ оказывается в конце строки. В пустой строке прокручивать нечего, поэтому пустая строка должна оставаться неизменной.
Примеры:
(scroll-left "") ; ""
(scroll-left "a") ;"a"
(scroll-left "abc") ; "bca"
(scroll-left "*----") ; "----*"
(scroll-left (scroll-left "*----")) ; "---*-"Ваше упражнение проверяется по этим тестам
#lang racket
(require (only-in rackunit check-equal? test-begin))
(require "index.rkt")
(test-begin
(check-equal? (scroll-left "") "")
(check-equal? (scroll-left "a") "a")
(check-equal? (scroll-left "abc") "bca")
(check-equal? (scroll-left
(scroll-left
(scroll-left "abc"))) "abc"))Решение учителя откроется через:
20:00
