True и False в Racket представлены значениями #t
и #f
. Запись непривычная, но в языках, созданных много лет назад, встречается и не такое. Большинство операций в Racket рассматривают как ложь только #f
. Всё остальное считается истиной. Пара примеров проверки на равенство:
(equal? 42 42) ; #t
(equal? 42 24) ; #f
Равенство значений проверяется через функцию equal?
. Иногда может потребоваться сравнение по ссылке, в таком случае используют eq?
.
Напишем функцию gt?
, которая возвращает #t
, если первое число больше второго и #f
в другом случае. В Racket имена предикатов заканчиваются вопросительным знаком. При этом к ним не добавляется префикс "is".
(define (gt? x y) (> x y))
(gt? 3 2) ; #t
(gt? 10 15) ; #f
Вот так разработчики на Ruby узнали, почему в их языке предикаты выглядят как вопросы :)
Теперь напишем предикат, определяющий четность числа. Для этого нам понадобится функция remainder
, которая вычисляет остаток от деления.
(define (even? n) (= (remainder n 2) 0))
(even? 3) ; #f
(even? 4) ; #t
Строго говоря, такая функция уже есть в языке. Здесь мы её реализуем заново только ради примера.
Логические операторы в Racket не имеют символьных обозначений, вместо этого используются функции and
, or
, not
и другие.
(not "moon") ; #f
(and (odd? 3) (even? 4)) ; #t
Как и в случае с арифметическими операциями, мы получаем два бонуса:
(and <one> <two> <three> <...>)
.Реализуйте функцию same-parity?
, которая принимает на вход два числа и возвращает #t
в том случае, если их четность совпадает. В ином случае возвращается #f
.
Воспользуйтесь логическими операторами и встроенными функциями odd? и even?.
(same-parity? 3 7) ; #t
(same-parity? 4 8) ; #t
(same-parity? 4 7) ; #f
(same-parity? 3 10) ; #f
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Привет! Я Тота и моя задача помочь в обучении. Чтобы активировать меня, нужно зарегистрироваться или залогиниться, если у вас уже есть аккаунт
Ваше упражнение проверяется по этим тестам
1#lang racket
2
3(require (only-in rackunit check-true check-false test-begin))
4(require "index.rkt")
5
6(test-begin
7 (check-true (same-parity? 3 7))
8 (check-true (same-parity? 4 8))
9 (check-false (same-parity? 4 7))
10 (check-false (same-parity? 3 10)))
11
Решение учителя откроется через: