Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| tutorials:advanced:events [2015/05/11 17:59] – gkazhoya | tutorials: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 |
| - | 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/ | + | |
| - | The protocol itself is defined in the '' | + | |
| - | + | ||
| - | Basically, there is a generic function called '' | + | |
| - | + | ||
| - | So, first, load the plan knowledge system and switch to its corresponding Lisp package: | + | |
| - | + | ||
| - | <code lisp> | + | |
| - | CL-USER> (asdf: | + | |
| - | CL-USER> (in-package : | + | |
| - | </ | + | |
| - | + | ||
| - | Next, we define a custom event class that inherits from '' | + | |
| - | + | ||
| - | <code lisp> | + | |
| - | PLAN-KNOWLEDGE> | + | |
| - | ((color-of-cat | + | |
| - | :initarg :cat-color :reader cat-color | + | |
| - | :initform (error | + | |
| - | ' | + | |
| - | : | + | |
| - | #< | + | |
| - | + | ||
| - | PLAN-KNOWLEDGE> | + | |
| - | CRAM-PLAN-KNOWLEDGE:: | + | |
| - | [symbol] | + | |
| - | CAT-APPEARED-EVENT names the standard-class #< | + | |
| - | CAT-APPEARED-EVENT>: | + | |
| - | Direct superclasses: | + | |
| - | No subclasses. | + | |
| - | Not yet finalized. | + | |
| - | Direct slots: | + | |
| - | COLOR-OF-CAT | + | |
| - | Initargs: : | + | |
| - | Initform: (ERROR ' | + | |
| - | " | + | |
| - | Readers: CAT-COLOR | + | |
| - | </ | + | |
| - | + | ||
| - | Now that we have our custom event type we define an event handler for it: | + | |
| - | + | ||
| - | <code lisp> | + | |
| - | PLAN-KNOWLEDGE> | + | |
| - | (format t "OMG! I just saw a ~a cat!~%" | + | |
| - | </ | + | |
| - | + | ||
| - | To trigger the event we simply call the '' | + | |
| - | + | ||
| - | <code lisp> | + | |
| - | PLAN-KNOWLEDGE> | + | |
| - | OMG! I just saw a black cat! | + | |
| - | </ | + | |
| - | + | ||
| - | Now, imagine that we would like to have multiple handlers for the same event. | + | |
| - | E.g., in addition to screaming excited each time we see a cat, we would also like to count the number of cats seen so far: | + | |
| - | + | ||
| - | <code lisp> | + | |
| - | PLAN-KNOWLEDGE> | + | |
| - | (defmethod on-event cat-counter ((event cat-appeared-event)) | + | |
| - | (incf saw-cats) | + | |
| - | (format t " | + | |
| - | </ | + | |

