Получить значение слота объекта

Мне нужно получить значение слота (передавая имя слота) из экземпляра, который может содержать другие экземпляры. Пример:

(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 get-) вне обработчиков сообщений класса и? Self: внутри. Чтобы получить слот, в котором имя слота хранится в переменной, используйте (send (sym-cat get- )). Использование? Self: является недопустимым синтаксисом для кратких ссылок на слоты.

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> 
Другие вопросы по тегам