Пример 11.40. Обработчики сообщений my-message классов user и object
(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.
Работа с объектами
Поскольку CLIPS реализует концепцию инкапсуляции данных, работа с объектами происходит посредством посылки им сообщений. Для этого существует системная функции send, которая содержит в качестве параметра объект назначения для сообщения, само сообщение и любые аргументы, которые передаются обработчику.
Дата добавления: 2021-12-14; просмотров: 263;