Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
tutorials:advanced:events [2015/05/11 17:31] – created gkazhoyatutorials:advanced:events [2018/04/04 09:20] (current) gkazhoya
Line 1: Line 1:
 ====== Events in CRAM ====== ====== Events in CRAM ======
  
-This is a short tutorial to showcase how to trigger and handle custom-defined events. +This page migrated [[tutorials:intermediate:events|here]].
-CRAM has an event protocol that makes the above-mentioned very simple. +
- +
-The event callback mechanism is based on the notion of hooks of the [[doc/package/cram_utilities|cram_utitlities]] package from the CRAM core. +
-The protocol itself is defined in the ``cram_plan_knowledge`` package. That is also the package where new types of events and their handlers should be defined. That's why we will work in that package. +
- +
-First, load the plan knowledge system and switch to the corresponding Lisp package: +
- +
-<code lisp> +
-CL-USER> (asdf:load-system :cram-plan-knowledge) ; or ,r-l-s RET cram_plan_knowledge RET RET +
-CL-USER> (in-package :plan-knowledge) +
-</code> +
- +
-Next, we define a custom event class that inherits from ''cram-plan-knowledge:event'' and has one data slot: +
- +
-<code lisp> +
-PLAN-KNOWLEDGE> (defclass cat-appeared-event (event) +
-                  ((color-of-cat +
-                    :initarg :cat-color :reader cat-color +
-                    :initform (error +
-                               'simple-error +
-                               :format-control "CAT-APPEARED-EVENT requires CAT-COLOR")))) +
-#<STANDARD-CLASS CAT-APPEARED-EVENT> +
- +
-PLAN-KNOWLEDGE> (describe 'cat-appeared-event) +
-CRAM-PLAN-KNOWLEDGE::CAT-APPEARED-EVENT +
-  [symbol] +
-CAT-APPEARED-EVENT names the standard-class #<STANDARD-CLASS +
-                                              CAT-APPEARED-EVENT>: +
-  Direct superclasses: EVENT +
-  No subclasses. +
-  Not yet finalized. +
-  Direct slots: +
-    COLOR-OF-CAT +
-      Initargs: :CAT-COLOR +
-      Initform: (ERROR 'SIMPLE-ERROR :FORMAT-CONTROL +
-                       "CAT-APPEARED-EVENT requires CAT-COLOR"+
-      Readers: CAT-COLOR +
-</code> +
- +
-Now that we have our custom event type we define an event handler for it: +
- +
-<code lisp> +
-PLAN-KNOWLEDGE> (defmethod on-event ((event cat-appeared-event)) +
-                  (format t "OMG! I just saw a ~a cat!~%" (cat-color event))) +
-</code> +
- +
-To trigger the event we simply call the ''cram-plan-knowledge:on-event'' function: +
- +
-<code lisp> +
-PLAN-KNOWLEDGE> (on-event (make-instance 'cat-appeared-event :cat-color "black")) +
-OMG! I just saw a black cat! +
-</code>+