2016-10-05 1 views
0

J'ai besoin de récupérer une valeur de slot (en passant un nom de slot) d'une instance qui peut contenir d'autres instances. Exemple:Récupère la valeur d'un objet

(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)) 

sous le nom "PARAM" contient une instance appelée [param-mainController].

La documentation CLIPS suggère de récupérer une valeur d'intervalle avec une commande d'envoi avec put-parameter. J'ai essayé d'utiliser une fonction générique pour récupérer un paramètre uniquement en passant le nom de l'emplacement.

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

Mais l'exécuter je reçois:

(envoyer [mainController] état get-param)

[MSGPASS2] Une telle instance mainController Envoyer fonction.

FAUX

Quelques questions:

1) Ai-je toujours besoin de définir un (créer-accesseur lire) pour chaque emplacement que je dois lire commande withsend?

2) Pourriez-vous suggérer quelques exemples de bonnes pratiques pour extraire une valeur de slot d'une instance?

Merci, Nic

Répondre

1

Par défaut, les gestionnaires Get- et put- sont créés pour les emplacements. Pour récupérer des emplacements spécifiques utiliser (envoyer <instance> get- <symbole>) en dehors des gestionnaires de messages d'une classe et? Self: <symbole> dans. Pour récupérer un emplacement dans lequel le nom de l'emplacement est stocké dans une variable, utilisez (envoyer <instance> (sym-cat get- variable >)). L'utilisation de? Self: <variable> est une syntaxe non valide pour les références sténo de fente.

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>