В зависимости от того, задан ли групповой параметр, созданный конструктором, обработчик может принимать точное число параметров или число параметров, не меньшее, чем некоторое заданное. Обязательные параметры определяют минимальное число аргументов, которые должны быть переданы обработчику. В действиях обработчика можно ссылаться на каждый из этих параметров так, как на обычные переменные, содержащие простые значения. Если был задан групповой параметр, то обработчик сообщения может принимать любое количество аргументов, большее или равное минимальному числу аргументов. Если групповой параметр не задан, то обработчик может принимать число аргументов, равное числу обязательных параметров. Все аргументы обработчика сообщения, которые не соответствуют обязательным параметрам, группируются в одно значение составного поля. Ссылаться на это значение можно, используя символ группового параметра. Для работы с групповым параметром могут применяться стандартные функции CLIPS, предназначенные для работы с составными полями, такие как length$ и nth$. Определение обработчика может содержать только один групповой параметр.
|
|
Параметры обработчика не имеют отношения к применимости обработчика к отдельным сообщениям. Однако, если число аргументов не соответствует необходимому, CLIPS сгенерирует сообщение об ошибке в момент вызова этого обработчика сообщения. Таким образом, принимаемое число аргументов должно быть совместимо со всеми обработчиками сообщений, применимых к некоторому сообщению.
Например, для класса car (пример 11.32) можно определить обработчик для инициализации слотов (пример 11.33).
Пример 11.32. Класс car
(defclass CAR (is-a USER)
(role concrete)
(slot front-seat)
(multislot trunk)
(slot trunk-count))
Пример 11.33. Инициализация объекта класса car
(defmessage-handler CAR put-items-in-car (?item $?rest)
(bind?self:front-seat?item)
(bind?self:trunk?rest)
(bind?self:trunk-count (length$?rest)))
Термин "активный экземпляр" обозначает экземпляр объекта, который в данный момент обрабатывает сообщение. Все обработчики сообщений имеют неявный объявленный параметр?self, ссылающийся на активный экземпляр. Это имя зарезервировано и не может явно включаться в список параметров обработчика сообщений. Кроме того, это имя не может быть переопределено в теле обработчика сообщений.