Последний шаг курса собирает изученные части в одно правило. Политика намеренно мала: невскрытый товар можно вернуть по 14-й день включительно. Главная привычка — сделать видимыми и решение, и его границу.
Опишите входы до кода
Процедура получает:
days— число дней после доставки;opened?—#t, если товар вскрыт, иначе#f.
Урок предполагает, что вызывающая сторона уже передала неотрицательное число дней и boolean. Проверка входа — отдельная граница решения; она разобрана в Детерминированной обработке ошибок.
Напишите правило
(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)).
Курс завершён
Теперь вы умеете читать вызовы, определять процедуру, сохранять список как данные, выбирать ветвь и проверять границу. Продолжите по нужному пути:
- Исходный текст и reader — глубже в язык;
- Создание решающих правил — более крупные правила;
- Изображения Лиспекса — обратимый визуальный артефакт точного исходника;
- Lispex Vouch — продвинутая аутентификация и текущая проверка запроса, закреплённого потребителем.