Обработка ошибок: Готовность к неожиданностям

Не все мысли всегда текут по правильному пути. В Лиспекс ошибка — это не сбой, а другая форма данных. Научитесь изящно обрабатывать непредвиденные ситуации и обеспечивать стабильность ваших программ.

Lispex v1 определяет только входную S‑поверхность и детерминированную нормализацию. Здесь описана диагностика времени парсинга/нормализации. Поведение во время выполнения и исключения — зона ответственности целевого/хостового окружения.

Коды диагностики

Рекомендуемые коды:

  • E100 — Синтаксис: нелегальный токен, ошибка скобок/точечного списка
  • E110 — Зарезервировано: попытка связать ключевое слово
  • E120 — Макрос: запрещённые пользовательские макросы/ридер‑расширения
  • E130 — Производные: неверная производная форма (напр., пустой cond)
  • E140 — Синтаксис: нелегальная форма точечного списка (напр., лишние элементы после точки)
  • E150 — Строки: неверный/вне диапазона escape (напр., некорректный \x..;)
  • W200 — Статика: неиспользуемая привязка
  • W210 — Статика: возможная немедленная самоссылка в letrec
  • W310 — Совместимость: замена #u8 в режиме R5RS‑compat
  • W320 — Совместимость: примечание о семантике сравнения в case
  • W330 — Стиль: используется псевдоним %; предпочтителен modulo

Формат сообщения (рекомен.): CODE file:line:col message

Примеры

E110: попытка связать ключевое слово

(let ((if 1)) if)   ; E110: нельзя связывать ключевое слово: if

E120: запрещённые макросы/ридер‑формы

(define-syntax swap ...)     ; E120: пользовательские макросы запрещены в v1
#; (пример ридер‑расширения) ; E120

E130: неверные производные формы

(cond)                       ; E130: пустой cond

E100: синтаксис точечного списка

(a b . c d)                  ; E100: нелегальный точечный список

E140: нелегальная форма точечного списка

(a .)                         ; E140: отсутствует хвост после точки

W310/W320: заметки по R5RS‑compat

При ;! compat: r5rs:

  • #u8(...) может быть заменён обычным вектором с предупреждением (W310).
  • В описании здесь case дан через equal? для простоты; реализация R5RS использует сравнение eqv? (W320).

W330: предупреждение о псевдониме modulo

Использование % вместо modulo может выдавать предупреждение стиля:

(% 10 3)    ; W330: предпочтителен (modulo 10 3)

Рекомендации

  • Используйте Core‑формы и разрешённые производные; избегайте пользовательских макросов.
  • Для последовательных зависимостей берите let*; для локальной рекурсии — letrec.
  • Поверхностный заголовок (module ...) держите простым; в R5RS‑compat ожидайте «сплющивание».
  • Добавляйте малые «золотые» тесты нормализации, чтобы раньше ловить E130.