Этот шаг объединяет ранее изученные части в одно законченное правило. Политика намеренно мала. Невскрытый товар можно вернуть по 14-й день включительно. Формируйте привычку делать наглядными и решение, и его границу.
Опишите входы до кода
Процедура получает два входа.
daysзадаёт число дней после доставки.opened?равно#t, если товар вскрыт, и#fв противном случае.
Урок предполагает, что вызывающая сторона уже передала корректное неотрицательное число дней и логическое значение. Проверка входных данных образует отдельную границу решения и изложена в Детерминированной обработке ошибок.
Напишите правило
(define (refund-decision days opened?)
(if (and (<= days 14) (not opened?))
'(decision allow)
'(decision deny outside-refund-window)))
(refund-decision 9 #f)Результат
(decision allow)Читайте проверку слева направо. Значение days не должно превышать 14, а
opened? должно быть ложным. При невыполнении первого условия and сразу
останавливается. if вычисляет только выбранное цитированное решение.
Метка отказа сделана намеренно консервативной. В реальной политике могут потребоваться отдельные причины для вариантов «слишком поздно» и «уже вскрыто». Это выбор продукта, а не скрытое поведение Лиспекса.
Проверяйте границу, а не только удачный случай
(list (refund-decision 14 #f)
(refund-decision 15 #f)
(refund-decision 9 #t))Результат
((decision allow) (decision deny outside-refund-window) (decision deny outside-refund-window))| Случай | Что он показывает | Решение |
|---|---|---|
| день 14, не вскрыт | включённая граница | разрешить |
| день 15, не вскрыт | первое значение снаружи | отказать |
| день 9, вскрыт | независимый провал второго условия | отказать |
Если позже <= заменят на <, первая строка изменится. Граничная таблица
делает такое изменение наглядным при проверке.
Сохраняйте детерминизм
Правило читает только свои аргументы. Оно не получает время с часов, не
вызывает сервер и не читает изменяемое состояние приложения. Вызывающая сторона
решает, как вычислить days, и передаёт это значение явно. При одинаковых двух
значениях Лиспекса и одинаковых документированных ограничениях среды выполнения
правило проходит тот же путь вычисления и даёт тот же наблюдаемый результат.
Это не доказывает справедливость политики, её юридическую достаточность или опору на точные реальные данные. Лиспекс делает вычисление проверяемым, а окружающее приложение остаётся ответственным за происхождение входа и внешнее действие.
Упражнение
Измените правило так, чтобы невскрытый товар разрешалось вернуть по 30-й день включительно. Добавьте два граничных вызова, которые показывают последнее разрешённое и первое отклонённое значение.
Показать один ответ
Замените (<= days 14) на (<= days 30) и выполните два граничных вызова.
(list (refund-decision 30 #f)
(refund-decision 31 #f))Ожидается ((decision allow) (decision deny outside-refund-window)).
Готовы к шагу 6?
Теперь вы умеете читать вызовы, определять процедуру, сохранять список как данные, выбирать ветвь и проверять границу. Следующим шагом станет Где выполняется ваша программа.
Отсюда можно и ответвиться от курса.
- Чтобы глубже изучить язык, откройте Исходный текст и считыватель.
- Чтобы сохранить точную запись одного запуска и проверить её, откройте Запуск и проверку записей решения.
- Чтобы превратить точный исходник в обратимый визуальный артефакт, откройте Изображения Лиспекса.
- Когда нужно аутентифицировать того, кто подписал правило, и заново проверить его по своему точному запросу, переходите к продвинутому процессу Ваучера Лиспекса.