Получить элемент строки, зная его индекс, можно с помощью функции 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 "*----")) ; "---*-"
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Ваше упражнение проверяется по этим тестам
1#lang racket
2
3(require (only-in rackunit check-equal? test-begin))
4(require "index.rkt")
5
6(test-begin
7 (check-equal? (scroll-left "") "")
8
9 (check-equal? (scroll-left "a") "a")
10
11 (check-equal? (scroll-left "abc") "bca")
12
13 (check-equal? (scroll-left
14 (scroll-left
15 (scroll-left "abc"))) "abc"))
16
Решение учителя откроется через: