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.