Песочница

Первое решающее правило

Соедините процедуры, условия, цитированные данные и граничные проверки в законченное правило срока возврата.

Последний шаг курса собирает изученные части в одно правило. Политика намеренно мала: невскрытый товар можно вернуть по 14-й день включительно. Главная привычка — сделать видимыми и решение, и его границу.

Опишите входы до кода

Процедура получает:

  • days — число дней после доставки;
  • opened?#t, если товар вскрыт, иначе #f.

Урок предполагает, что вызывающая сторона уже передала неотрицательное число дней и boolean. Проверка входа — отдельная граница решения; она разобрана в Детерминированной обработке ошибок.

Напишите правило

LISPEX
(define (refund-decision days opened?)
  (if (and (<= days 14) (not opened?))
      '(decision allow)
      '(decision deny outside-refund-window)))

(refund-decision 9 #f)

Результат

OUTPUT
(decision allow)

Читайте тест слева направо. days должно быть не больше 14, а opened? — ложным. При провале первого условия and останавливается. if вычисляет только выбранное цитированное решение.

Причина отказа намеренно одна и консервативна. Реальная политика может различать «слишком поздно» и «вскрыто». Это выбор продукта, а не скрытое поведение Лиспекса.

Проверяйте границу, а не только удачный случай

LISPEX
(list (refund-decision 14 #f)
      (refund-decision 15 #f)
      (refund-decision 9 #t))

Результат

OUTPUT
((decision allow) (decision deny outside-refund-window) (decision deny outside-refund-window))
СлучайЧто он показываетРешение
день 14, не вскрытвключённая границаразрешить
день 15, не вскрытпервое значение снаружиотказать
день 9, вскрытнезависимый провал второго условияотказать

Если позже <= заменят на <, первая строка изменится. Таблица делает это заметным при проверке.

Сохраняйте детерминизм

Правило читает только аргументы. Оно не получает часы, не вызывает сервер и не читает скрытое изменяемое состояние. Вызывающая сторона вычисляет days и передаёт его явно. При одинаковых двух значениях и одинаковых документированных ограничениях путь вычисления и наблюдаемый результат одинаковы.

Это не доказывает справедливость или юридическую достаточность политики и не подтверждает реальные входные данные. Лиспекс делает вычисление проверяемым; происхождение входа и внешнее действие остаются обязанностью приложения.

Упражнение

Разрешите возврат невскрытого товара по день 30 и добавьте вызовы для последнего разрешённого и первого отклонённого значения.

Показать один ответ

Замените (<= days 14) на (<= days 30) и проверьте:

LISPEX
(list (refund-decision 30 #f)
      (refund-decision 31 #f))

Ожидается ((decision allow) (decision deny outside-refund-window)).

Курс завершён

Теперь вы умеете читать вызовы, определять процедуру, сохранять список как данные, выбирать ветвь и проверять границу. Продолжите по нужному пути: