2016-10-05 37 views
0

我需要从可能包含其他实例的实例中检索插槽值(传递插槽名称)。 实施例:获取对象的插槽值

(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-mainController]一个实例。

CLIPS文档建议使用带put参数的send命令检索插槽值。 我试图使用通用函数只通过传递slotname来检索参数。

(defmessage-handler USER get-param (?param-name) 
    (printout t "Slot value: " ?self:?param-name crlf)) 

但执行它,我得到:

(发[mainController]得到-PARAM状态)

[MSGPASS2]在功能上不发送这样的实例mainController。

FALSE

一些问题:

1)我总是需要定义每个插槽我需要阅读withsend命令(创建,访问读取)?

2)你能否建议一些例子和最佳实践从实例中检索一个插槽值?

谢谢 尼克

回答

1

默认情况下,槽被创建的get-和put-处理程序。要检索特定插槽的使用(发送<实例>获取-<符号>)以外的类的消息处理程序和?self:<符号>之内。要检索插槽名称存储在变量中的插槽,请使用(发送<实例>(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>