(defmessage-handler USER my-message around ()
(call-next-handler))
(defmessage-handler USER my-message before ())
(defmessage-handler USER my-message ()
(call-next-handler))
(defmessage-handler USER my-message after ())
(defmessage-handler OBJECT my-message around ()
(call-next-handler))
(defmessage-handler OBJECT my-message before ())
(defmessage-handler OBJECT my-message ())
(defmessage-handler OBJECT my-message after ())
Диаграмма, приведенная на рис. 11.20, иллюстрирует порядок выполнения обработчиков, связанных с классами user и object, при посылке сообщения my-message объекту класса наследника user. Скобки показывают место начала и конца работы отдельного обработчика. Обработчики, находящиеся внутри скобок другого обработчика, являются скрытыми.
Если во время выполнения обработчика происходит ошибка, любой текущий выполняемый обработчик прерывается, обработчики, которые еще не начали выполнение, игнорируются, и функция send возвращает значение FALSE.
Если для пословного сообщения нет применимого обработчика primary или при вызове обработчика было передано неверное число параметров, CLIPS сгенерирует сообщение об ошибке и прервет выполнение программы.
Рис.11.20. Последовательность выполнения обработчиков сообщений my-message, связанных с классами USER и OBJECT
|
|
Возвращаемое функцией send значение — это значение, полученное от наиболее определенного обработчика around или наиболее определенного обработчика primary, если обработчика around нет. Значение, возвращаемое обработчиком, является результатом вычисления последнего действия в этом обработчике.
Значения, возвращаемые обработчиками before и after, игнорируются. Эти обработчики применяются только для выполнения дополнительных полезных действий. Обработчик around может выбирать игнорировать или использовать значения, полученные от менее определенных обработчиков around или primary. Обработчик primary может выбирать игнорировать или использовать значения, полученные от менее определенных обработчиков primary.