Параметры обработчиков сообщений

В зависимости от того, задан ли групповой параметр, созданный конструк­тором, обработчик может принимать точное число параметров или число параметров, не меньшее, чем некоторое заданное. Обязательные параметры определяют минимальное число аргументов, которые должны быть переда­ны обработчику. В действиях обработчика можно ссылаться на каждый из этих параметров так, как на обычные переменные, содержащие простые значения. Если был задан групповой параметр, то обработчик сообщения может принимать любое количество аргументов, большее или равное мини­мальному числу аргументов. Если групповой параметр не задан, то обработ­чик может принимать число аргументов, равное числу обязательных пара­метров. Все аргументы обработчика сообщения, которые не соответствуют обязательным параметрам, группируются в одно значение составного поля. Ссылаться на это значение можно, используя символ группового параметра. Для работы с групповым параметром могут применяться стандартные функции 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, ссылающийся на активный экземп­ляр. Это имя зарезервировано и не может явно включаться в список пара­метров обработчика сообщений. Кроме того, это имя не может быть переопределено в теле обработчика сообщений.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: