(defclass CAR (is-a USER) ; user-defined class (role concrete) ; instances can be made (slot id) (multislot owner) (slot color) (slot value) ) (defclass JALOPY (is-a CAR) (slot color (allowed-values grey rust blue)) (slot value (range 0.0 1000.0)) ) (defclass LUXURY (is-a CAR) (slot color (allowed-values grey red green)) (slot value (range 0.0 100000.0)) )
(list-defclasses) (browse-classes) ;shows classes' hierachy (superclassp CAR LUXURY) (subclassp CAR LUXURY) (ppdefclass CAR) (undefclass CAR) (describe-class CAR) (class-abstractp CAR)
(definstances Cars (c1 of CAR (value 5000.0)) (c2 of LUXURY (color red) (value 15000.)))
(instances) (list-definstances) (ppdefinstances Cars) (undefinstances Cars)
(make-instance c3 of CAR) (unmake-instance c3 of CAR)
(modify-instance c1 (value 5500.0))
(defclass CAR (is-a USER) (role concrete) (pattern-match reactive) (slot id ) (multislot owner) (slot color) (slot value) ) (defrule mix-and-match (object (is-a CAR) (name ?id) (color red|blue|green) (value ?val) ) => (printout t crlf "car " ?id " value = " ?val) )
(defclass CAR (is-a USER) (role concrete) (pattern-match reactive) (slot color (create-accessor read-write)) ;to create message handlers automatically (slot value (create-accessor read-write)) ) (definstances Cars (c1 of CAR (value 5000.0)) (c2 of CAR (color red)))
Now both color and value slots have get- and put- message handlers to use. create-accessor can be also read or write only.
(send [c1] put-color (send [c2] get-color)) ;c1 has set same color as c2
Example: cars.clp
(defmessage-handler USER init primary () ) (defmessage-handler USER delete primary () ) (defmessage-handler USER print primary () ) (send [c1] print) (send [c1] delete)
(defclass CAR (is-a USER) (role concrete) (pattern-match reactive) (slot id (create-accessor read-write) (default (gensym*))) (slot color (create-accessor read-write)) (slot value (create-accessor read-write)) ) (definstances Cars (c1 of CAR (value 5000.0)) (c2 of CAR (color red)) ) (send [c1] print) (send [c2] print)
Both [c1] and [c2] will have the same id, because the slot default facet is static. The default value is set when the class is defined and never changed. Change the default facet to dynamic-deault facet will solve this problem.
(defclass CAR (is-a USER) (role concrete) (slot id (create-accessor read-write) (default-dynamic (gensym*))) ... )
Example: cars-default.clp
Previous Procedural Programming Up TOC Next Message Handlers