2016-10-05 81 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>