Получить значение слота объекта
Мне нужно получить значение слота (передавая имя слота) из экземпляра, который может содержать другие экземпляры. Пример:
(defclass MAINCONTROLLER (is-a USER)
(slot uuid
(type STRING))
(slot param
(type INSTANCE))
(multislot zones
(type INSTANCE))
(slot state
(allowed-values a b c))
(slot pump
(allowed-values on off)))
(make-instance mainController of MAINCONTROLLER
(uuid "myController123")
(param [param-mainController])
(zones [zone1] [zone2])
(state a)
(pump on))
Слот с именем "param" содержит экземпляр с именем [param-mainController].
В документации CLIPS предлагается получить значение слота с помощью команды send с put-параметром. Я попытался использовать универсальную функцию для получения параметра только путем передачи имени слота.
(defmessage-handler USER get-param (?param-name)
(printout t "Slot value: " ?self:?param-name crlf))
Но, выполнив это, я получаю:
(отправить состояние [mainController] get-param)
[MSGPASS2] Нет такого экземпляра mainController в функции send.
ЛОЖНЫЙ
Некоторые вопросы:
1) Нужно ли мне всегда определять (read-accessor read) для каждого слота, который мне нужно прочитать с помощью команды send?
2) Не могли бы вы предложить несколько примеров с рекомендациями по получению значения слота из экземпляра?
Спасибо ник
1 ответ
По умолчанию обработчики get и put создаются для слотов. Чтобы извлечь определенные слоты, используйте (send
CLIPS> (clear)
CLIPS>
(defclass MAINCONTROLLER (is-a USER)
(slot uuid
(type STRING))
(slot param
(type INSTANCE))
(multislot zones
(type INSTANCE))
(slot state
(allowed-values a b c))
(slot pump
(allowed-values on off)))
CLIPS>
(defmessage-handler MAINCONTROLLER myprint ()
(printout t ?self:state crlf))
CLIPS>
(deffunction retrieve-slot (?ins ?slot-name)
(printout t (send ?ins (sym-cat get- ?slot-name)) crlf))
CLIPS>
(make-instance mainController of MAINCONTROLLER
(uuid "myController123")
(param [param-mainController])
(zones [zone1] [zone2])
(state a)
(pump on))
[mainController]
CLIPS> (send [mainController] get-state)
a
CLIPS> (send [mainController] myprint)
a
CLIPS> (retrieve-slot [mainController] state)
a
CLIPS>