Это предыдущая редакция документации. Актуальная диагностика описана в разделах «Как читать ошибки и предупреждения» и «Коды ошибок и предупреждений».
Lispex определяет входную S-поверхность и детерминированную нормализацию. Здесь описана диагностика времени парсинга и нормализации. Ошибки времени выполнения производит эталонный интерпретатор. Попробуйте их в Песочнице.
Коды диагностики
Рекомендуемые коды:
- E100, синтаксис: нелегальный токен, ошибка скобок или точечного списка
- E110, зарезервировано: попытка связать ключевое слово
- E120, макрос: запрещённые пользовательские макросы или ридер-расширения
- E130, производные формы: неверная производная форма, например пустой
cond - E140, синтаксис: нелегальная форма точечного списка, например лишние элементы после точки
- E150, строки: неверный или вне диапазона escape, например некорректный
\x..; - W200, статика: неиспользуемая привязка. Зарезервировано и не выдаётся эталонным интерпретатором.
- W210, статика: возможная немедленная самоссылка в
letrec. Зарезервировано и не выдаётся. - W330, стиль: используется псевдоним
%. Предпочтителенmodulo. - W331, стиль: используется псевдоним
list-firstилиlist-rest. Предпочтительныfirstилиrest.
Формат сообщения (рекомен.): CODE file:line:col message
Примеры
E110: попытка связать ключевое слово
(let ((if 1)) if) ; E110: нельзя связывать ключевое слово: ifE120: запрещённые макросы/ридер‑формы
(define-syntax swap ...) ; E120: пользовательские макросы запрещены
#; (пример ридер‑расширения) ; E120E130: неверные производные формы
(cond) ; E130: пустой condE100: синтаксис точечного списка
(a b . c d) ; E100: нелегальный точечный списокE140: нелегальная форма точечного списка
(a .) ; E140: отсутствует хвост после точкиW330: предупреждение о псевдониме modulo
Использование % вместо modulo может выдавать предупреждение стиля:
(% 10 3) ; W330: предпочтителен (modulo 10 3)Обрабатываемые ошибки
Ошибки времени выполнения можно перехватывать. guard связывает поднятое условие и выполняет cond‑подобные клаузы, заново поднимая его, если ни одна не подошла и нет else:
(guard (e ((error-object? e) (error-object-message e))
(else e))
(error "file not found" 404)) ; ⇒ "file not found"(raise obj)поднимает любой объект (непродолжаемо);(raise-continuable obj)позволяет обработчику вернуть значение обратно в вызов.(error message irritant…)создаёт объект ошибки и поднимает его.error-object?/error-object-message/error-object-irritantsего осматривают. Перехваченная внутренняя ошибка, например несвязанная переменная илиcarот не-пары, тоже является объектом ошибки.(with-exception-handler handler thunk)это низкоуровневый примитив. Обработчик выполняется в точкеraise, при текущем внешнем обработчике. Повседневная форма:guard.- Детерминированный предел рекурсии перехватить нельзя. Он всегда раскручивается до верхнего уровня.
Рекомендации
- Используйте Core‑формы и разрешённые производные; избегайте пользовательских макросов.
- Для последовательных зависимостей берите
let*; для локальной рекурсии беритеletrec. - Поверхностный заголовок
(module ...)держите простым; он сплющивается на верхний уровень. - Добавляйте малые «золотые» тесты нормализации, чтобы раньше ловить E130.