Песочница

Обработка ошибок

Ошибки парсинга, нормализации и выполнения в Lispex, включая формы, которые можно перехватить.

Это предыдущая редакция документации. Актуальная диагностика описана в разделах «Как читать ошибки и предупреждения» и «Коды ошибок и предупреждений».

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: попытка связать ключевое слово

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

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

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

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

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

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

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

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

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

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

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

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

Обрабатываемые ошибки

Ошибки времени выполнения можно перехватывать. guard связывает поднятое условие и выполняет cond‑подобные клаузы, заново поднимая его, если ни одна не подошла и нет else:

LISPEX
(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.