Когда это нужно
Выбирайте условную форму по вопросу: один выбор «да/нет», несколько предикатов, сравнение одного значения с фиксированными данными или односторонний эффект. Ложным является только #f.
Проверьте запуском
LISPEX
(case 2 ((1) 'one) ((2) 'two) (else 'other))Наблюдаемый результат
OUTPUT
twoРазбор примера
case один раз вычисляет 2, сравнивает его с каждым указанным значением через eqv? и выбирает вторую ветвь. Результатом становится цитированный символ two; ветвь else не выполняется.
Как рассуждать
cond,case,and,or,when,unless,let*, именованныйlet,doи quasiquote сохраняют закреплённый порядок и хвостовые позиции.- Сгенерированные временные имена и скрытые intrinsics нельзя захватить или затенить пользовательскими именами.
caseсравнивает datum черезeqv?; ложные путиwhenиunlessдают ноль значений.
Быстрый выбор
| Форма | Когда применять | Поведение результата |
|---|---|---|
if | ровно две ветви | возвращает выбранную ветвь |
cond | несколько предикатов описывают случаи | возвращает первую подходящую ветвь |
case | одно значение сравнивается с фиксированными данными | вычисляет ключ один раз |
and / or | нужна короткая остановка цепочки | возвращает значение операнда, а не приведённый Boolean |
when / unless | нужен односторонний эффект | ложный путь даёт ноль значений |
Частая ошибка
Нет define-syntax и пользовательского расширения макросов.
Текущие границы
- Отдельные
unquoteиunquote-splicingвне quasiquote — статические ошибки.
Куда дальше
Повседневные формы разбираются в уроке о данных и решениях, а точная нормализация — в справочнике производных форм.