(if test-expr then-expr else-expr)
Условная конструкция в Racket — это специальная форма, в которой 4 элемента. Первый — if
, затем — выражение-предикат (test-expr
). Если предикат вернул истину, то выполняется then-expr
, иначе else-expr
. В Racket if
всегда содержит ветку else
.
(if (> 3 2) "yes" "no") ; "yes"
Подчеркну, что форма if
— это выражение, а значит у неё есть результат. Это резко отличается от большинства привычных языков, в которых if
– это специальная инструкция. Выражения делают код проще, а его возможности – шире. Все дальнейшие формы, которые мы рассмотрим, также будут выражениями.
Почему if
называется особой формой? Давайте разберем на примере.
(if (> 3 2) (displayln "yes") (displayln "no")) ; => yes
Что напечает на экран эта программа? В нормальных формах сначала вычисляются все элементы формы, а затем уже сама форма. Это так называемый аппликативный порядок вычисления. Он используется в большинстве языков и привычен для большинства программистов. Мы ожидаем, что аргументы функции вычисляются до того как попадут в функцию.
Но в случае с примером выше поведение другое. Оно зависит от результата предиката. То есть в форме if
выполняется ровно то выражение, которое должно выполняться по логике формы if
: первое, если предикат вернул истину, и второе, если ложь. Именно поэтому форма является особой. Подобную форму невозможно реализовать на самом языке без механизма макросов (а с макросами — можно).
Существует и другой порядок, так называемый нормальный порядок вычисления. Самый известный язык, использующий его – Haskell. В этом языке ничто не вычисляется до тех пор, пока не понадобится результат вычисления.
Реализуйте функцию sentence-type
, которая возвращает строку "cry"
, если переданый текст написан заглавными буквами, и возвращает строку "common"
в остальных случаях.
(sentence-type "HOW ARE YOU?") ; "cry"
(sentence-type "Hello, world!") ; "common"
Для перевода строки в верхний регистр используйте функцию string-upcase
.
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Ваше упражнение проверяется по этим тестам
1#lang racket
2
3(require (only-in rackunit check-equal? test-begin ))
4(require "index.rkt")
5
6(test-begin
7 (check-equal? (sentence-type "HOW?") "cry")
8 (check-equal? (sentence-type "HoW?") "common"))
9
Решение учителя откроется через: