Действия обработчика сообщений представляют собой последовательность выражений, которые выполняются в заданном порядке, при вызове обработчика. Значение, возвращаемое обработчиком — результат вычисления последнего выражения в теле обработчика.
Слотами объекта можно манипулировать, только используя сообщения-акцессоры объекта. Однако обработчики сообщений являются частью объекта, инкапсулирующего данные и методы их обработки. Таким образом, в действиях обработчика можно манипулировать слотами объекта непосредственно, минуя механизм сообщений. Кроме того, некоторые функции неявно оперируют активным экземпляром объекта (так же без использования сообщений). Применять эти функции можно только из обработчиков сообщений. Полный список таких функций приведен в гл. 15.
Для доступа к слотам активного экземпляра из действий обработчиков сообщений используется следующая конструкция:
Определение 11.8. Доступ к слоту из обработчика сообщений
?self:<имя-слота>
|
|
Приведем пример обработчика сообщений, напрямую манипулирующего со слотами объекта, и определим класс и один обработчик.
Пример 11.34. Использование слотов в обработчиках сообщений класса
(defclass A (is-a USER)
(role concrete)
(slot foo (default 1))
(slot bar (default 2)))
(defmessage-handler A print-all-slots ()
(printout t?self:foo " "?self:bar crlf))
Обработчик сообщения print-all-slots выводит на экран содержимое слотов foo и bar. Причем значения, хранящиеся в этих слотах, передаются напрямую, а не с помощью сообщений.
Помимо получения текущего значения обработчики также могут устанавливать новые значения слотов. Для этого используется функция bind.
Определение 11.9. Установка значений слотов в обработчиках сообщений класса
(bind?self:<имя-слота> <значение>*)
Например, для класса а из предыдущего примера можно определить обработчик, приведенный в примере 11.35.