2016-10-05 2 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은"[PARAM-mainController]라고하는 인스턴스를 포함한다.

CLIPS 문서는 put 매개 변수를 사용하여 send 명령으로 슬롯 값을 검색 할 것을 제안합니다. 일반 함수를 사용하여 슬롯 이름을 전달하여 매개 변수를 검색하려고했습니다.

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

는 그러나 그것을 실행 내가 얻을 :

(전송 [mainController] 얻을-PARAM 상태)

[MSGPASS2] 기능 전송에서 그러한 예를 mainController.

FALSE

몇 가지 질문 :

1) 내가 withsend 명령을 읽을 필요가 모든 슬롯에 대한 읽기 (생성-접근)를 정의하는 것이 필요합니까?

2) 인스턴스에서 슬롯 값을 검색하는 모범 사례를 제시해주십시오.

는 GET 및 put- 핸들러는 슬롯 생성, 기본적으로 닉

답변

1

을 주셔서 감사합니다. 특정 슬롯을 검색하려면 클래스의 메시지 처리기 외부에서 < 인스턴스 > get- < 기호 >을 보내고 < 기호 > 안에있는 클래스 메시지 핸들러를 사용하십시오. 변수에 슬롯 이름이 저장된 슬롯을 검색하려면 (< > (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>