Встроенная обработка ошибок lisp ECL - PullRequest
1 голос
/ 13 октября 2011

Задача: Вложить ECL lisp в мой проект, настроить обработку ошибок и подробный отчет об ошибках (где произошла ошибка, вид ошибки и т. Д.)

ECL не имеет документации по встроенному API и документации по обработке ошибок ...

Можете ли вы предложить, как это реализовать?

1 Ответ

6 голосов
/ 14 октября 2011

Нет глобального обработчика ошибок, потому что это не философия Common Lisp. Если вы хотите обрабатывать ошибки, делайте это с легкостью.

1) Создайте функцию, которая использует HANDLER-CASE или HANDLER-BIND, чтобы установить соответствующие обработчики ошибок и перехватывать ошибки вокруг формы, которая должна быть оценена. Что-то вроде

(DEFUN MY-EVAL (FORM) (HANDLER-CASE (ФОРМА EVAL) (ОШИБКА (С) ...) (МОЯ ОШИБКА (С) ...) ...))

Эта функция может быть определена в вашем коде C и вызвана.

2) Используйте функции, которые создает ECL, которые перехватывают все ошибки. Наиболее важным является si_safe_eval (форма, окружение, error_value). Он оценивает ФОРМУ lisp в ОКРУЖАЮЩЕЙ СРЕДЕ (обычно Cnil) и возвращает свой вывод или ERROR_VALUE, если он получил какую-то ошибку.

Некоторые примеры, которые используют ту или иную технику: http://thread.gmane.org/gmane.lisp.ecl.general/5365 (2-е сообщение) http://thread.gmane.org/gmane.lisp.ecl.general/8526/focus=8529

...